2010-01-16 77 views
2

我的课是这个样子(我只包括相关属性):NHibernate:获取多个实体与子集合的子集?

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个orderlines通过上述标准检索每个订单?

我已经使用基于以下示例的过滤器试图(从NHibernate的资料为准):

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

但是,当我给Order.OrderLinesCreateFilter方法,它首先检索所有orderlines,然后事后检索10条第一条命令,这不是我想要的。我也尝试将此与调用NHibernateUtil.Initialize结合起来无济于事。

如何为此问题创建分离标准?或者,如果这不是完全可能的话,那么如何为每个订单检索10个第一个结果,而无需获取整个集合?

+0

如果你做的“标准”,而不是调用SetMaxResults发生什么呢? – 2010-01-21 15:54:12

回答

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