left c# nhibernate hql criteria restrictions

c# - left - nhibernate session createquery



Criterios de NHibernate donde cualquier elemento de la propiedad de la lista es verdadero (1)

Lo que necesitaríamos es Sub-SELECT . Esto podría lograrse con subconsulta .

15.8. Consultas separadas y subconsultas

Podemos definir la subconsulta con DetachedCriteria :

var subquery = DetachedCriteria.For<OrderItem>() .Add(Restrictions.Eq("FinalDeliveryIndicator", true)) .SetProjection(Projections.Property("OrderId"));

Esto luego terminaría como este fragmento SQL:

(SELECT OrderId FROM OrderItems WHERE FinalDeliveryIndicator = 1 )

Y esta subconsulta que podemos utilizar como parte de DONDE en nuestra consulta principal

... search.Add(Subqueries.PropertyIn("Id", subquery)) ...

Lo que agregaría esta restricción a la cláusula WHERE:

SELECT ... FROM Order this_ JOIN ... WHERE ... AND this_.OrderId IS IN // the above subquery (SELECT OrderId FROM OrderItems WHERE FinalDeliveryIndicator = 1 )

Tengo una consulta de Criteria NHibernate ya creada que necesito modificar para poder agregar una nueva condición.

La consulta se basa en el objeto Order , que tiene una lista de OrderItems y luego, cada OrderItem tiene una propiedad bool llamada FinalDeliveryIndicator .

En mi consulta Criteria, necesito agregar una condición en la que deseo que todos los pedidos que al menos uno de sus artículos de OrderItems tenga el bool FinalDeliveryIndicator establecido en verdadero .

La consulta, por el momento, es:

var search = NHibernateSession.CreateCriteria(typeof(Order)) .CreateAlias("Contract", "C", JoinType.InnerJoin) .CreateAlias("C.Supplier", "S", JoinType.InnerJoin) .Add(Restrictions.Eq("Buyer.Id", companyId)) .Add(Restrictions.Eq("IsDeleted", false)) .Add(Restrictions.Eq("IsActiveVersion", true)) .SetFirstResult(paging.PageIndexSQL) .SetMaxResults(paging.PageSize) .AddOrder(SortOrder.Desc("Id"));

Ahora necesito agregar esa condición de la que te hablé. Esta consulta ya está en uso en muchos lugares de esta aplicación y, por lo tanto, no puedo cambiar a QueryOver ni a ningún otro tipo de consulta, debido al riesgo de colapsar algo.