2008-10-29 6 views

Répondre

3

Eh bien, vous pouvez exposer des propriétés qui sont filtrés sur la carte, comme ceci:

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

L'attribut « où » est arbitraire SQL.

Théoriquement, vous pouvez avoir deux propriétés Customer, Orders et ShippedOrders. Cependant, je dois dire que je n'ai pas fait cela, et je voudrais tester comment NH gère la cascade dans ce cas. Dans tous les cas, vous devrez faire attention lorsque de nouveaux éléments sont ajoutés/supprimés qu'ils sont ajoutés/supprimés correctement dans les deux collections. Le fait que vous vouliez faire cela fait que nous nous demandons si Order est une racine agrégée. Il est peut-être moins de problèmes à long terme le faire comme ceci:

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

Cela impliquerait de charger les commandes deux fois, bien qu'il n'y ait pour elles que des entités distinctes –

1

Vous pouvez regarder l'autre manière - charger toutes les commandes expédiées pour un client.

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

Vous pouvez aussi le faire en utilisant HQL en utilisant session.Filter (customer.Orders, "où this.Status ==" Expédiée");

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>(); 

quelque chose comme ça.

Questions connexes