我尝试将SQL"NOT IN"表达式转换为LINQ,发现应该使用"Contains"选项。我有两张桌子:
ProductsGroups Products
-------------- ---------
id product_id
product_id product_name
我的查询如下:
var innerQuery = from pg in Session.Query<ProductsGroups>
select pg.product_id;
var Query = from p in Session.Query<Products>
where !innerQuery.Contains(p.product_id)
select new {p.product_id, p.product_name};
但是nHibernate生成的sql是错误的:
select p.product_id, p.product_name
from Products p
where not (exists (select product_id
from ProductsGroups pg
where p.product_id = pg.id))
"where"子句不在右侧字段,它将product_id与products组id进行比较。有人知道我该怎么解决吗?
同时,我找到的解决方案是将第一个查询转换为列表,然后在第二个查询中使用此列表:
var innerQuery = (from pg .....).ToList();
然后,nHibernate将"Contains"表达式翻译为"NOT IN",正如我所希望的:
select p.product_id, p.product_name
from Products p
where not (p.product_id in (1,2,3,4))
我不确定,但我认为您遇到了一个问题b/c包含通过"使用默认相等比较器"来确定元素是否在集合中。(MS文档)我假设您的产品组映射将其Id指定为Id属性。因此,从nHibernate的角度来看,这就是用来确定平等的价值。