首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制返回的NHibernate实体

限制返回的NHibernate实体
EN

Stack Overflow用户
提问于 2013-02-06 03:26:18
回答 1查看 281关注 0票数 2

我正在尝试限制NHibernate条件将返回的实体数量。标准似乎是使用SetMaxResults,但如果我的标准涉及多对多关系上的左外部联接,这就不能正常工作。

举个例子:

狗有主人(多对多关系),我需要检索属于某组主人的最多10只狗。正在做什么

代码语言:javascript
复制
session.CreateCriteria<Dog>()
  .CreateAlias("Owners", "Owners")
  .Add(Restrictions.In("Owners.Id", idCollection)
  .SetMaxResults(10)
  .List<Dog>();

将转换为SQL查询,如

代码语言:javascript
复制
SELECT TOP(10) * FROM DOGS d
  LEFT OUTER JOIN OWNERS_DOGS od ON d.id = od.id
  WHERE od.OWNER_ID IN (:valueone, :valuetwo)

我的最高限制发生得太早了,导致一只拥有多个符合条件的主人的狗多次计算到我的限制10次。有没有一种干净的方法告诉NHibernate,我只想让它水化前X个狗对象?我可能无法在数据库上执行完整的SELECT,但如果我可以避免加载系统中的每一条狗就好了,因为我只会显示其中的10条狗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-06 13:13:56

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

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

子查询15.8. Detached queries and subqueries

代码语言:javascript
复制
DetachedCriteria subQuery = DetachedCriteria.For(typeof(Dog))
    // WHERE conditions go here
    .SetProjection( Projections.Property("ID") )
;

具有正确分页的查询

代码语言:javascript
复制
session.CreateCriteria(typeof(Dog))
    .Add(Subqueries.PropertyEq("ID", subQuery));
    // PAGING goes here
    .SetMaxResults(10)
    .List();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14715321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档