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

标签 c# nhibernate hql criteria restrictions

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

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

在我的 Criteria 查询中,我需要添加一个条件,在该条件下,我希望所有订单的至少一个 OrderItemsFinalDeliveryIndi​​cator 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/

相关文章:

c# - 可以使用属性来防止调用方法吗?

c# - 我应该怎么做才能在 .NET 2.0 中使用 Task<T>?

c# - NHibernate Definitive Cascade 应用指南

hadoop - 如何强制配置单元数据类型

hibernate - 在 Grails 中 HQL 插入查询

jpa - 如何将 PSQLs::json @>::json 转换为 jpa/jpql 谓词

c# - Try/Catch Wrap Around Task.Run 不处理异常

c# - 尝试使用 EPPlus 从 ZipArchive 读取 Excel 文件

nhibernate - json.net 在序列化期间忽略 nhibernate 代理对象

nhibernate - ASP.NET MVC 2 RC 模型与 NHibernate 和下拉列表绑定(bind)