2010-05-06 4 views
6

J'essaye de construire une requête dans NHibernate pour retourner une liste de clients sans commandes correspondant à un critère spécifique.Requête Nhibernate et n'existe pas

Mon objet client contient un ensemble de commandes:

<set name="Orders"> 
    <key column="CustomerID" /> 
    <one-to-many class="Order" /> 
</set> 

Comment puis-je contruct une requête en utilisant l'API ICriteria NHibernate pour obtenir une liste de tous les clients qui ont pas d'ordre? En utilisant SQL natif, je suis en mesure de représenter la requête comme ceci:

select * from tblCustomers c where not exists 
    (select 1 from tblOrders o where c.ID = o.CustomerID) 

Je suis incapable de comprendre comment faire cela en utilisant des alias et des objets DetatchedCriteria. Toute orientation serait appréciée!

Merci!

Répondre

7

cela se traduirait que sql ...

session.CreateCriteria<Customer>("c") 
    .Add(Subqueries.NotExists(
     DetachedCriteria.For<Order>("o") 
     .SetProjection(Projections.Constant(1)) 
     .Add(Restrictions.PropertyEq("c.ID", "o.Customer.ID")) 
     //Add more order restricitions here 
    )) 
    .List<Customer>(); 

si vous ne souhaitez que les clients sans commandes que vous pouvez également utiliser Restrictions.IsEmpty() faire exactement la même chose que ci-dessus.

session.CreateCriteria<Customer>() 
    .Add(Restrictions.IsEmpty("Orders")) 
    .List<Customer>() 
+0

Merci, je pense que cela me permettra de démarrer. NHibernate se plaindra-t-il de l'utilisation de o.CustomerID ... cette colonne est dans la base de données mais n'est pas mappée en tant que colonne dans ma classe Order. (NHibernate l'a ajouté automatiquement comme spécifié dans l'ensemble du client en tant que colonne de clé.) – Dan

+0

oh..c'est exact, il doit être 'o.Customer.ID' – dotjoe

+0

Est-ce que les deux entités doivent être mappées les unes aux autres pour que tout fonctionne ? Parce que actuellement je ne peux pas entrer dans la déclaration, même intellisense ne le met pas en évidence. –