2010-05-06 7 views
6

Estoy intentando construir una consulta en NHibernate para devolver una lista de clientes sin pedidos que coincidan con un criterio específico.Pregunta de Nhibernate y no existente

Mi objeto al cliente contiene un conjunto de órdenes:

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

¿Cómo Contruct una consulta mediante ICriteria API de NHibernate para obtener una lista de todos los clientes que no tienen órdenes? Utilizando SQL nativo, estoy en condiciones de representar a la consulta como la siguiente:

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

he sido incapaz de encontrar la manera de hacer esto utilizando alias y objetos DetatchedCriteria. Cualquier orientación sería apreciada!

Gracias!

Respuesta

7

esto se traduciría en 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 solo deseas clientes sin pedidos también se podría utilizar Restrictions.IsEmpty() hacer exactamente lo mismo que el anterior.

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

Gracias, creo que esto me ayudará a comenzar. NHibernate se quejará sobre el uso de o.CustomerID ... esa columna está en la base de datos, pero no está mapeada como una columna en mi clase de orden. (NHibernate lo agregó automáticamente como se especifica en el conjunto del Cliente como la columna de clave.) – Dan

+0

oh..eso es, debe ser 'o.Customer.ID' – dotjoe

+0

. Ambas entidades tienen que estar mapeadas entre sí para que todo funcione ? Porque actualmente no puedo ingresar a la declaración, incluso intellisense no lo resalta. –

Cuestiones relacionadas