LINQ to nHibernate - перевод выражения SQL "NOT IN" в LINQ - PullRequest
0 голосов
/ 24 января 2012

Я попытался перевести выражение SQL «НЕ В» в 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};

Но sql, который генерирует nHibernate, неверен:

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. Кто-нибудь знает, как я могу решить эту проблему?

Решение, которое я пока нашел, заключается в преобразовании первого запроса.перечислить, а затем использовать этот список во втором запросе:

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))

1 Ответ

0 голосов
/ 03 августа 2012

Я не уверен, но я думаю, что вы столкнулись с проблемой, которую содержит b / c, определяет, находится ли элемент в коллекции, «используя средство сравнения по умолчанию».(Документация MS) Я предполагаю, что в вашем сопоставлении группы продуктов указан его Id в качестве свойства Id.Таким образом, с точки зрения nHibernate это значение используется для определения равенства.

...