2

我试图限制 NHibernate Criteria 将返回的实体数量。标准似乎是使用 SetMaxResults,但如果我的标准涉及多对多关系的 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 条。

4

1 回答 1

2

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

请参阅此答案的更多详细信息:https ://stackoverflow.com/a/14080092/1679310

子查询15.8。分离查询和子查询

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();
于 2013-02-06T05:13:56.143 回答