NHibernate Criteria 列表 属性 的任何元素为真
NHibernate Criteria Where any element of list property is true
我已经创建了一个 NHibernate Criteria
查询,我需要对其进行修改,以便添加新条件。
查询基于 Order
对象,它有一个 OrderItems
的列表,然后每个 OrderItem
都有一个 bool 属性 名为 FinalDeliveryIndicator
。
在我的条件查询中,我需要添加一个条件,在该条件下,我希望所有订单中至少有一个 OrderItems
的 FinalDeliveryIndicator
布尔值设置为 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 )
我已经创建了一个 NHibernate Criteria
查询,我需要对其进行修改,以便添加新条件。
查询基于 Order
对象,它有一个 OrderItems
的列表,然后每个 OrderItem
都有一个 bool 属性 名为 FinalDeliveryIndicator
。
在我的条件查询中,我需要添加一个条件,在该条件下,我希望所有订单中至少有一个 OrderItems
的 FinalDeliveryIndicator
布尔值设置为 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 )