我有一个已经创建的 NHibernate Criteria
查询,我需要对其进行修改,以便添加新条件。
查询基于 Order
对象,它有一个 OrderItems
列表,然后每个 OrderItem
都有一个 bool 名为 FinalDeliveryIndicator
的属性。
在我的 Criteria 查询中,我需要添加一个条件,在该条件下,我希望所有订单的至少一个 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 或其他类型的查询,因为有崩溃的风险。
最佳答案
我们需要的是Sub-SELECT
。这可以通过子查询 来实现。
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 )
关于c# - NHibernate Criteria 列表属性的任何元素为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30242846/