2

如果我在像这样只需要该 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 分析器,我对此查询有 SELECT N+1 ALERT。

4

2 回答 2

1

如果 x.Photos 不是 IQueryable,则 .First() 调用无法参与 ORM 发送的 SQL 查询。我怀疑是这种情况。

唯一的解决方案是从 ISession 手动构造查询。

于 2012-05-29T21:30:19.277 回答
0

当表达式树被折叠时,NHibernate 应该生成 SQL 以仅检索单个实体。

于 2012-05-29T21:22:17.077 回答