NHibernate:使用子集合的子集获取多个实体?

时间:2010-01-16 14:18:04

标签: c# .net asp.net nhibernate detachedcriteria

我的课程看起来像这样(我只包括相关的属性):

public class Order 
{
   public virtual Customer Customer { get; set; }
   public virtual IEnumerable<OrderLine> OrderLines { get; set; }
}

public class OrderLine 
{
   public virtual string Product { get; set; } // Simplified
}

现在我想要的是创建一个分离的条件,为给定的客户选择所有订单,同时只检索每个订单的前10个OrderLines。第一部分很简单:

Customer someCustomerObject = ...;
var criteria = DetachedCriteria.For<Order>().Add(Restrictions.Eq("Customer", someCustomerObject);

但是,我如何指示NHibernate急切地检索上述标准检索到的每个订单的前10个订单?

我尝试使用基于以下示例的过滤器(取自Nhibernate文档):

session.CreateFilter( lazyCollection, "").SetFirstResult(0).SetMaxResults(10).List();

但是当我将Order.OrderLines提供给CreateFilter方法时,它首先检索所有订单行,然后检索10个第一个订单行,这不是我想要的。我也尝试将其与对NHibernateUtil.Initialize的调用结合起来无济于事。

如何为此问题创建分离条件?或者,如果这不是完全可能的话,如何检索每个订单,只有10个第一个结果,而不是取出整个集合?

1 个答案:

答案 0 :(得分:0)

您可以在Order类的NHibernate映射文件中将batch-size属性设置为10。这样,它急切地加载集合的前10个元素,并延迟加载其余元素。我会按如下方式绘制集合:

<set name="OrderLines" table="OrderToOrderLine" batch-size="10">
    <key column="OrderId"/>
    <one-to-many class="OrderLine"/>
</set>

更多信息,请继续阅读:NHibernate Mapping - Collections