混淆nhibernate n + 1警报消息

时间:2012-05-30 11:24:04

标签: c# linq nhibernate orm

在我的查询中,我试图选择所有实体(其中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);

每个属性必须有一张或多张照片,我只需要第一张,所以我使用的是Photos.First()

当这一行注释掉时Photo = prop.Photos.First()nhib。 profiler报告加载了20个实体,这些实体很好(来自第一个查询的实体)。

但是使用Photo = prop.Photos.First()加载的实体增加到65个实体,该数字应该大约。等于属性+照片集。

有人指向正确的方向吗?

在nhib。生成的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

1 个答案:

答案 0 :(得分:2)

对于每个属性(获取其列表的单个查询),您正在执行另一个查询以获取第一张照片。在您尝试访问它之前,不会填充Photos集合,从而导致第二次查询。

作为原始查询的一部分加入照片表,将其缩减为单个查询。