C# NHibernate条件,其中列表属性的任何元素都为true
我已经创建了一个NHibernateC# 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
条件
查询,需要对其进行修改,以便添加一个新条件
查询基于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 )