我试图将 SQL“NOT IN”表达式转换为 LINQ,我发现我应该使用“包含”选项。我有 2 张桌子:
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 与 progucts 组 id 进行比较。 有谁知道我该如何解决?
我同时找到的解决方案是将第一个查询转换为列表,然后在第二个查询中使用此列表:
var innerQuery = (from pg .....).ToList();
然后,nHibernate 将“包含”表达式转换为“NOT IN”,如我所愿:
select p.product_id, p.product_name
from Products p
where not (p.product_id in (1,2,3,4))