Skip to main content
 首页 » 编程设计

c#之NHibernate:获取具有子集合子集的多个实体

2024年01月13日31lexus

我的类看起来像这样(我只包含相关属性):

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 个 OrderLine。第一部分很简单:

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 个结果,而不获取整个集合?

请您参考如下方法:

您可以在 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