NHibernate的。 QueryOver Take(n) - 使用Left.Join

时间:2015-05-17 12:47:35

标签: nhibernate fluent-nhibernate queryover

使用Take()加入时出现了一些奇怪的行为。假设以下示例:

Comment comment = null;
var persons = _repository
        .QueryOver()
        .Left.JoinAlias(x => x.Comments, () => comment)
        .Where(x => x.Age > 20)
        .Take(5)
        .Future()
        .ToList();

我希望数组中有5个人,每个人都有一个N comments列表。

但是,结果会给5个人提供最多5个评论。

为什么.Take(5)也会限制评论数量?

如何达到预期效果?

1 个答案:

答案 0 :(得分:2)

这里的要点是我们对分页及其实现的需求的差异。

  • 虽然我们希望返回5个 root 元素,
  • 结果转换为5个,5个选定的行:

在此问答中可以找到一些线索。答:NHibernate QueryOver with Fetch resulting multiple sql queries and db hits

如果使用SQL Server 2012 dialect进行分页,我们会看到这样的SQL:

SELECT ...
FROM root
JOIN collection
WHERE....
OFFSET 0 ROWS -- skip 0 or 10 or 20 rows
FETCH NEXT 5 ROWS ONLY; -- take 5 rows

因此,如果chidren(注释)的数量为5 +

,最终会导致返回一个根实体

解决方案?我建议你这样做:

  • 只选择 root 实体
  • 使用批量抓取来加载儿童

只选择root,也可以选择任意多对一/参考。这将以星型模式结构结束,左连接将再次正确地覆盖根实体。

批量提取在doc:

中描述

19.1.5. Using batch fetching

一些类似的问题: