NHibernate Criteria list属性的任何元素都为true

我有一个已经创建的NHibernate Criteria查询,我需要修改,所以我可以添加一个新的条件。

该查询基于Order对象,该对象具有OrderItems列表,然后每个OrderItem都有一个名为FinalDeliveryIndicatorbool属性。

在我的Criteria查询中,我需要添加一个条件,我希望所有订单中至少有一个OrderItemsFinalDeliveryIndicator bool设置为true

目前的查询是:

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

现在我需要补充我告诉你的那个条件。 此查询已在此应用程序的许多位置使用,因此我无法切换到QueryOver或其他类型的查询,因为存在崩溃的风险。

我们需要的是Sub-SELECT 。 这可以通过子查询来实现。

15.8。 分离的查询和子查询

我们可以使用DetachedCriteria定义子查询:

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

这将最终作为此SQL片段结束:

 (SELECT OrderId FROM OrderItems WHERE FinalDeliveryIndicator = 1 ) 

这个子查询我们可以在主查询中用作WHERE的一部分

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

哪个会将此限制添加到WHERE子句中:

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