NHibernate Criteria 列表 属性 的任何元素为真

NHibernate Criteria Where any element of list property is true

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

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

在我的条件查询中,我需要添加一个条件,在该条件下,我希望所有订单中至少有一个 OrderItemsFinalDeliveryIndicator 布尔值设置为 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。这可以通过 subquery 来实现。

15.8. Detached queries and subqueries

我们可以定义子查询 DetachedCriteria:

var subquery = DetachedCriteria.For<OrderItem>()
    .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 )