2

私のクエリでは、すべてのエンティティ (20 個) を選択し、このようにコレクションを反復しようとしています

List<Domain.Property> data = session.Query<Domain.Property>().ToList();

PropertyViewModel viewModel;
List<PropertyViewModel> listOfViewModels = new List<PropertyViewModel>();

foreach (Domain.Property prop in data)
{
    viewModel = new PropertyViewModel()
    {
        AdType = prop.AdType.ToString(), 
        CityName = prop.CityName, 
        ContructionYear = prop.ConstructionYear, 
        Photo = prop.Photos.First()

    };
}
listOfViewModels.Add(viewModel);

各プロパティには 1 枚以上の写真が必要です。必要なのは最初の 1 枚だけなので、Photos.First() を使用しています。

この行がコメントアウトされている場合 Photo = prop.Photos.First() nhib. プロファイラーは、20 個のエンティティが読み込まれたことを報告しますが、これは問題ありません (最初のクエリからのもの)。

しかし、 Photo = prop.Photos.First() を使用すると、ロードされたエンティティは 65 エンティティに増加し、その数は約 65 になるはずです。プロパティ + 写真コレクションに相当します。

誰でも正しい方向を指すことができますか?

そしてニブで。生成されたSQLがあります

SELECT photos0_.PropertyId    as PropertyId1_,
       photos0_.Id            as Id1_,
       photos0_.Id            as Id1_0_,
       photos0_.ImageData     as ImageData1_0_,
       photos0_.ImageMimeType as ImageMim3_1_0_,
       photos0_.PropertyId    as PropertyId1_0_
FROM   Photo photos0_
WHERE  photos0_.PropertyId = 117 /* @p0 */

これは SELECT N+1 としてマークされています

4

1 に答える 1

2

プロパティごとに (それらのリストを取得するための単一のクエリ)、最初の写真を取得するために別のクエリを実行しています。Photosコレクションにアクセスして 2 番目のクエリが発生するまで、コレクションは読み込まれません。

元のクエリの一部として photos テーブルに結合して、単一のクエリに減らします。

于 2012-05-30T11:26:08.627 に答える