0

我试图将 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))
4

1 回答 1

0

我不确定,但我认为您遇到了问题 b/c contains 通过“使用默认相等比较器”确定元素是否在集合中。(MS 文档)我假设您的产品组映射将其 Id 指定为 Id 属性。因此,从 nHibernate 的角度来看,这是用于确定相等性的值。

于 2012-08-03T17:46:42.130 回答