限制NHibernate实体返回

时间:2013-02-05 19:26:18

标签: nhibernate many-to-many max

我正在尝试限制NHibernate Criteria将返回的实体数量。标准似乎是使用SetMaxResults,但如果我的Criteria在多对多关系中涉及LEFT OUTER JOIN,则这不能正常工作。

一个例子:

狗拥有所有者(多对多的关系),我需要检索最多10只属于某些所有者的狗。做

session.CreateCriteria<Dog>()
  .CreateAlias("Owners", "Owners")
  .Add(Restrictions.In("Owners.Id", idCollection)
  .SetMaxResults(10)
  .List<Dog>();

将转换为

之类的SQL查询
SELECT TOP(10) * FROM DOGS d
  LEFT OUTER JOIN OWNERS_DOGS od ON d.id = od.id
  WHERE od.OWNER_ID IN (:valueone, :valuetwo)

我的TOP限制发生得太早,导致有多个所有者的狗符合标准多次计数到我的极限10.有没有一种干净的方式告诉NHibernate我只想让它给第一只X狗补水对象?我可能无法在数据库上执行完整的SELECT,但如果我可以避免加载系统中的每只狗,那将是很好的,因为我只会显示其中的10个。< / p>

1 个答案:

答案 0 :(得分:2)

在这种情况下,解决方案是子查询。我们需要的是创建内部SELECT ,它将由狗主人过滤并返回Dog ID 。然后我们将查询Dogs,通过子查询过滤它们。最后,我们的分页将是正确的,同时在平面结构上执行。

请参阅此答案以了解更多详情:https://stackoverflow.com/a/14080092/1679310

子查询15.8. Detached queries and subqueries

DetachedCriteria subQuery = DetachedCriteria.For(typeof(Dog))
    // WHERE conditions go here
    .SetProjection( Projections.Property("ID") )
;

具有正确分页的查询

session.CreateCriteria(typeof(Dog))
    .Add(Subqueries.PropertyEq("ID", subQuery));
    // PAGING goes here
    .SetMaxResults(10)
    .List();