使用 *OR* 和 *AND* 子句的左连接的 nHibernate QueryOver
nHibernate QueryOver with a Left Join using *OR* and *AND* clauses
几个小时后寻找答案我失败了。可能是太简单了也没人讲过,可能是我没有用对的词去搜索。
基本上我需要在 LEFT JOIN table 上使用 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 执行之前,给了我 'Reference not set'。我找到了关于使用 'Restrictions' 的说明,但是 none(或者至少,none 对我有限的头脑足够清楚)使用 OR 和 AND togheter。
感谢任何帮助。
我认为您只是在 where 子句中 order
上缺少 .Id
:
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 服务器):
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
)
);
几个小时后寻找答案我失败了。可能是太简单了也没人讲过,可能是我没有用对的词去搜索。
基本上我需要在 LEFT JOIN table 上使用 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 执行之前,给了我 'Reference not set'。我找到了关于使用 'Restrictions' 的说明,但是 none(或者至少,none 对我有限的头脑足够清楚)使用 OR 和 AND togheter。
感谢任何帮助。
我认为您只是在 where 子句中 order
上缺少 .Id
:
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 服务器):
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
)
);