2009-10-26 6 views
1

J'ai deux entités dites Customer et Order qui existent d'elles-mêmes et n'ont aucune relation définie dans un fichier de mappage.Nhibernate ICreteria relation entre les tables

Maintenant, je veux NHibernate me donner le résultat de la requête suivante:

select customer.id,customer.name from customer,order 
where customer.id = order.id 
and order.status = "Open" 

J'ai essayé d'utiliser une projection, mais lors de l'examen de la sql de sortie que je vois Nhibernate génère une sous-requête qui n'est pas mon intention (et moins performant?)

public IList<Customer> GetOpenOrders() 
{ 
        DetachedCriteria orders = DetachedCriteria.For<Order>("orders") 
        .SetProjection(Projections.Property("orders.id")); 

        ICriteria cret = session.CreateCriteria(typeof(Customer)) 
        .Add(Subqueries.PropertyIn("id", orders)) 
        .Add(Expression.Eq("Status", "open")); 

        return cret.List<Customer>(); 
} 

est-il possible de le faire avec critères ou est-il une meilleure façon d'y parvenir ce genre de questions?

Répondre

1

Je ne sais pas si vous pouvez le faire avec l'API ICriteria car les requêtes sont créées ICriteria contre un objet spécifique, mais vous devriez être en mesure de le faire avec HQL:

select customer 
from Customer customer, Orders order 
where customer.id = order.id and order.status = 'Open' 
1

Une meilleure façon serait reliant le client et l'ordre dans la cartographie.

  1. La classe de client a une collection de commandes en tant que propriété.
  2. La classe de commande a un client comme propriété.
  3. deux

Ceci est un peu plus de travail dans la cartographie, mais il sera moins de travail pour écrire les requêtes et le code en utilisant les objets du client et commander.

1

si la collecte de commandes ont votre client, vous pouvez utiliser ceci:

ICriteria cret = session.CreateCriteria(typeof(Customer)) 
        .CreateCriteria("orders") 
          .Add(Expression.Eq("Status", "open")); 
Questions connexes