使用*或*和*和*子句进行左联接的nHibernate查询

使用*或*和*和*子句进行左联接的nHibernate查询,nhibernate,queryover,Nhibernate,Queryover,经过几个小时的寻找答案,我失败了。也许这太简单了,没有人谈论过,也许我没有用正确的术语来搜索 基本上,我需要在左联接表上使用OR and子句。我希望在一次询问中做到这一点。生成的SQL应该如下所示: SELECT customer.name, order.id FROM customer LEFT JOIN order ON (order.idcustomer = customer.id) WHERE customer.active AND (order.id IS NULL o

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

基本上,我需要在左联接表上使用OR and子句。我希望在一次询问中做到这一点。生成的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)
Wich是指所有活跃客户及其订单,但仅限于从未下过订单或在特定时间段内有订单的客户

我在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))
在执行之前,上面的查询给了我“Reference not set”。我找到了关于使用“限制”的说明,但是没有,或者至少,没有一个是清楚的,对于我有限的头脑来说,使用or和togheter


非常感谢您的帮助。

我认为您的where条款中缺少了订单上的.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 Server:

选择 此名称为y0, 订单1\u.Id为y1\u 从…起 这个顾客 左外部联接[Order]order1\在此\uID=order1\uCustomerID上 哪里 此u0.Active=@p0和 order1.Id为NULL或
order1.Date>=@p1和order1.Date耶!它起作用了!我以前试过,但由于C编译器一直说order.Id==null将始终为假,因为Id是长的,我认为这不起作用,所以没有尝试。@RogerKiihl:啊,是的,这很有意义。幸运的是,QueryOver使用的表达式实际上并没有在运行时进行计算,它们只是被解析并最终转换为SQL,所以在这里可以安全地忽略这些类型的警告。