SQL の "NOT IN" 式を LINQ に変換しようとしたところ、"Contains" オプションを使用する必要があることがわかりました。私は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 を製品グループ ID と比較します。 どうすれば解決できるか知っている人はいますか?
その間、私が見つけた解決策は、最初のクエリをリストに変換し、このリストを2番目のクエリで使用することです:
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))