如果我发送具有Photos集合的名为Property的对象,当我只需要像这样的Photos集合中的第一个元素时,这种方法是否加载了集合中的所有元素而不是assoc。只是我想要的第一个,或者这个方法是我需要的,首先从收集中加载。
public PropertyHPViewModel(Property x)
{
Id = x.Id;
Created = x.Created;
Title = x.Title;
Photo = x.Photos.First();
}
从探查器生成的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 = 129 /* @p0 */
更新 由于我有20个生成的查询,所有查询仅在最后一行
WHERE photos0_.PropertyId = xxx /* @p0 */
其中数字是照片ID对象,我必须根据nhibernate profiler添加我对此查询的SELECT N + 1 ALERT。
答案 0 :(得分:1)
如果x.Photos不是IQueryable,则.First()调用不能参与ORM发送的SQL查询。我怀疑是这种情况。
唯一的解决方案是从ISession手动构建查询。
答案 1 :(得分:0)
当表达式树被折叠时,NHibernate应该生成SQL以仅检索单个实体。