nHibernate QueryOver使用* OR *和* AND *子句进行左连接

时间:2016-05-18 12:54:53

标签: 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,在执行之前,给了我'Reference not set'。我找到了关于使用“限制”的说明,但是使用OR和AND togheter没有(或者至少没有明确表示我的思想有限)。

我感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

我认为你在where子句中错过了order 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)) // -----------------^

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
        )
    );

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

    X/pow2(2,round(log2(X)))