最初にEFDBを使用すると、多対多の関係を持つ2つのエンティティ(Supplier、Product)があります。Entity Frameworkは、関連付けられたテーブル(SupplierProduct)のエンティティを作成しません。これは、関連付けられたテーブルに強力なエンティティの主キーのみが含まれているためです。
特定の製品を提供していないすべてのサプライヤーに次のクエリを取得しています。
var q1 = context.Suppliers.Where(s=>!s.Products.Any(p=>p.Id == 1));
生成されたSQLは、次のようなEXISTS依存サブクエリを使用します。
SELECT *
FROM Suppliers s
WHERE NOT EXISTS
(SELECT 1
FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)
Linq to Entitiesメソッド構文を使用して、代わりに関連するテーブルで結合を使用するクエリを生成することは可能ですか?
すなわち:
SELECT DISTINCT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId != 1
アップデート
JoeEnosが指摘しているように、上記の私のクエリは同じことをしません。NOT EXISTSサブクエリは、おそらくここに行くための最良の方法です。製品を供給したすべてのサプライヤーを獲得しようとした場合はどうなりますか?linqをエンティティクエリに少し変更して次のようにします。
var q1 = context.Suppliers.Where(s => s.Products.Any(p=>p.Id == 1));
そして、生成されるSQLは次のようになります。
SELECT *
FROM Suppliers s
WHERE EXISTS
(SELECT 1
FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)
どちらでも構いませんが、希望する結果が得られます。ただし、この場合にSQLを記述している場合は、通常、次のようにします。
SELECT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId = 1
linq to entityクエリを変更して、上記のSQLを生成できますか?