nHibernate QueryOver 与使用 *OR* 和 *AND* 子句的左连接

标签 nhibernate queryover

几个小时后寻找答案我失败了。也许太简单了,没有人谈论过它,也许我没有使用正确的术语进行搜索。

基本上我需要在 LEFT JOIN 表上使用 OR 和 AND 子句。我希望在 QueryOver 中做到这一点。生成的 SQL 应如下所示:

SELECT customer.name, order.id
  FROM customer
  LEFT JOIN order ON (order.idcustomer = customer.id)
 WHERE customer.active
   AND (order.id IS NULL or (order.date >= :p0 AND order.date <= :p1)

这意味着,所有活跃的客户及其订单,但只有那些从未下订单或在特定时期内有订单的客户。

我在 QueryOver 中得到的最接近的是:
Order order = null;

var query = session.QueryOver<Customer>()
   .Left.JoinAlias(x => x.Orders, () => order)
   .Where(x => x.Active)
   .And(() => order == null || (order.date >= date1 && order.date <= date2))

上面的 QueryOver,在执行 even 之前,给了我“未设置引用”。我找到了有关使用“限制”的说明,但没有(或者至少,我有限的头脑中没有足够清楚)使用 OR 和 AND 。

我很感激任何帮助。

最佳答案

我想你只是缺少一个 .Idorder在您的 where 子句中:

Order order = null;

var query = session.QueryOver<Customer>()
   .Left.JoinAlias(x => x.Orders, () => order)
   .Where(x => x.Active)
   .And(() => order.Id == null || (order.date >= date1 && order.date <= date2))
// -----------------^

这给了我以下 SQL (SQL Server):

SELECT
    this_.Name as y0_,
    order1_.Id as y1_ 
FROM
    Customer this_ 
    LEFT OUTER JOIN [Order] order1_ ON this_.Id = order1_.CustomerId
WHERE
    this_.Active = @p0 AND (
        order1_.Id IS NULL OR (
            order1_.Date >= @p1 AND order1_.Date <= @p2
        )
    );

关于nHibernate QueryOver 与使用 *OR* 和 *AND* 子句的左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37300274/

相关文章:

c# - 帮助 QueryOver 和 WhereExists

c# - 从数据库问题下载 ASP.NET MVC 3 文件

c# - 休眠子集合

nhibernate - 如何在 Nhibernate QueryOver 中获取具有子项计数的父实体列表

.net - NHibernate 使用 QueryOver : WHERE and EXISTS

nhibernate - 如何将 Skip 和 Take 附加到 nHibernate IQueryOver

nhibernate - 渴望获取多个集合属性(使用QueryOver/Linq)?

c# - 批量HQL插入

NHibernate 3.3.1 通过代码与property-ref的多对多关系映射

mysql - 使用 NHibernate QueryOver<> 获取表中的所有字段