C# NHibernate条件,其中列表属性的任何元素都为true

C# NHibernate条件,其中列表属性的任何元素都为true,c#,nhibernate,hql,criteria,restrictions,C#,Nhibernate,Hql,Criteria,Restrictions,我已经创建了一个NHibernate条件查询,需要对其进行修改,以便添加一个新条件 查询基于Order对象,该对象有一个OrderItems列表,然后每个OrderItem都有一个名为FinalDeliveryIndicator的bool属性 在我的条件查询中,我需要添加一个条件,我希望所有订单中至少有一个OrderItems的FinalDeliveryIndicatorbool设置为true 目前的问题是: var search = NHibernateSession.CreateCriter

我已经创建了一个NHibernate
条件
查询,需要对其进行修改,以便添加一个新条件

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

在我的条件查询中,我需要添加一个条件,我希望所有订单中至少有一个
OrderItems
FinalDeliveryIndicator
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或其他类型的查询,因为存在崩溃的风险。

我们需要的是
子选择。这可以通过子查询实现

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

var subquery = DetachedCriteria.For<OrderItem>()
    .Add(Restrictions.Eq("FinalDeliveryIndicator", true))
    .SetProjection(Projections.Property("OrderId"));
这个子查询可以用作主查询中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 )

很高兴看到这一点,真的!享受伟大的恩希伯内特,先生;)
SELECT ...
FROM Order this_
JOIN ...
WHERE ...
AND this_.OrderId IS IN // the above subquery
        (SELECT OrderId FROM OrderItems WHERE FinalDeliveryIndicator = 1 )