Я попытался перевести выражение 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))