【问题标题】:Limiting NHibernate Entities Returned限制 NHibernate 实体返回
【发布时间】:2014-05-18 21:32:56
【问题描述】:

我正在尝试限制 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 条。

【问题讨论】:

  • 但是你不是被owner_id限制了吗?这意味着拥有多个所有者的狗不应该成为问题(除非您允许 owner_dogs 中的重复行)?
  • 感谢您指出这一点。我的真实世界场景要复杂一些。我修复了这个例子,使其更适用。

标签: nhibernate many-to-many max


【解决方案1】:

这种情况下的解决方案是子查询。我们需要的是创建inner 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();

【讨论】:

  • 你是个了不起的人!感谢你的回答。我必须做的唯一小改动是使用 Subqueries.PropertyIn("ID", subQuery) vs PropertyEq,因为子查询本身返回多行。
  • 如果这行得通,那就太好了;)您已经根据自己的需要对其进行了调整,真是太棒了。祝你好运
猜你喜欢
  • 2012-11-25
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2020-11-29
相关资源
最近更新 更多