几个小时后寻找答案我失败了。也许太简单了,没有人从未谈过它,也许我没有使用正确的术语来搜索。
基本上我需要在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没有(或者至少没有明确表示我的思想有限)。
我感谢任何帮助。
答案 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)))