使用Nhibernate过滤使用Aggregate Root返回的子集合

时间:2008-10-29 16:54:07

标签: c# nhibernate

我正在尝试使用Nhibernate加载聚合根的子集合。向客户加载已发货的所有订单。这可能吗?

4 个答案:

答案 0 :(得分:3)

好吧,您可以公开在地图中过滤的属性,如下所示:

<bag name="shippedOrders" ... where="Status == 'Shipped'" >
   <key column="CustomerId" />
   <one-to-many class="Order" />
</bag>

'where'属性是任意SQL。

理论上,您可以拥有Customer,Orders和ShippedOrders的两个属性。但是,我应该说我没有这样做,我想测试NH在这种情况下如何处理级联。在任何情况下,添加/删除新项目时都必须注意将它们正确添加/删除到两个集合中。

您想要这样做的事实让我们想知道Order是否是聚合根。从长远来看,这可能不那么麻烦:

orderRepository.GetOrders(int customerId, OrderStatus[] statuses)

答案 1 :(得分:1)

您可以通过另一种方式查看 - 加载客户的所有已发货订单。

session.CreateCriteria( typeOf(Order) )
    .Add( Restrictions.Eq("Shipped", shippedStatus ) )
    .Add( Restrictions.Eq("Customer", requiredCustomer) )
    .List<Order>();

答案 2 :(得分:1)

你也可以使用session.Filter(customer.Orders,“where this.Status =='Shipped'”)使用HQL;

答案 3 :(得分:1)

ICriteria crit = session.CreateCriteria (typeof(Customer));

crit.CreateAlias ("Orders", "o");
crit.Add (Expression.Eq ("o.Status", shippedStatus));
crit.Add (Expression.Eq ("Id", customerId));

return crit.UniqueResult <Customer>();

类似的东西。