【问题标题】:nHibernate: limit the result set of a mapped collectionnHibernate:限制映射集合的结果集
【发布时间】:2010-03-07 11:02:25
【问题描述】:

如何限制 nHibernate 中映射集合的结果集?例如:

Model.Items;

将始终返回给定模型的所有项目。有没有办法强制它只返回 20 个项目而不创建特定查询?像

Model.Items.SetMaxResults(20); 

换句话说,当我访问一个集合时,我希望 nHibernate 返回 IQueryable 而不是简单的 IList。

更新。虽然我已经接受了答案,但我想指出这不符合 nHibernate 的预期使用方式,应该在单独的查询。

【问题讨论】:

  • 您要解决的问题是什么? Items 集合通常有多大?
  • 几百个项目被延迟加载。

标签: nhibernate


【解决方案1】:

你想要的可以用一个过滤器来完成:

IQuery q = nhSession.CreateFilter(Parent.ChildCollection, "select count(*)");
long countResult = q.UniqueResult<long>();

正如您在 IQuery 中看到的过滤器,您并不局限于我刚刚给出的“选择计数”范例。 此外,此解决方案需要映射一个普通集合,因此您可以以多种方式使用它。

【讨论】:

    【解决方案2】:

    .SetProjection(Projections.Property("Items")) .SetMaxResults(20)

    【讨论】:

    • 使用 System.Linq; IList 结果 = session.CreateCriteria(typeof(Model)) .SetProjection(...).list(); IQueryable q = results.AsQueryable();
    • Nhibernate 有这个参数用于映射集合 。但似乎,我认为这是你想要的不同的东西。所以只有 Criteria 允许动态控制获取记录。
    【解决方案3】:

    是的,您可以使用&lt;loader /&gt; 映射元素来指定将加载集合的查询。更多信息可以在herehere找到。

    【讨论】:

    • 这很酷,但它不会让我在访问集合时为 LIMIT 指定参数,这是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多