0

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

1 に答える 1

0

よくわかりませんが、「デフォルトの等値比較子を使用して」要素がコレクション内にあるかどうかを判断する b/c contains という問題が発生していると思います。(MS ドキュメント) productgroup マッピングで Id プロパティとして Id が指定されていると仮定します。したがって、nHibernate の観点からは、これが同等性を判断するために使用する値です。

于 2012-08-03T17:46:42.130 に答える