1

EntityFrameworkでの多対多結合に最適なソリューションは何ですか。edmxファイルにテーブルを追加した後にEFを使用した1つのプロジェクトでは、交差エンティティの追加を無視したようです。

これらのテーブルで

Customer(CustomerId,...)
CustomerOrder(CustomerId,OrderId)
Order(OrderId,...)

CustomerOrderテーブルがedmxに追加されなかったため、テーブルを従来の(LINQ to SQLでこれを行っていた方法を意味する従来の)内部結合クエリで結合できませんでした。

var q = from c in db.Customers
        join co in db.CustomerOrders on c.CustomerId equals co.CustomerId
        join o in db.Orders on co.OrderId equals o.OrderId
        select a;

以前に尋ねられた質問を見て理解しているように、where句で条件を指定するか、intersectsキーワードを使用して、複数の選択を実行して「参加」することができます。しかし、このような状況でのベストプラクティスを知りたいと思います。

顧客の注文を調べたいとしましょう。そのクエリをどのように記述すればよいでしょうか。

4

2 に答える 2

5

明確にするために、2つのテーブルが追加された場合、結合テーブルIDだけでなく、結合テーブルがedmxの一部ではありません。EFが結合テーブルをエンティティとして使用しないことを決定したシナリオでは、他の各テーブルには、手動で結合する必要なしに結合テーブルにアクセスできるナビゲーションプロパティ(Orders持つICollection<Customer> Customers、およびCustomers持つ)が必要です。ICollection<Orders>そのシナリオでは、次のことができます。

var customer = dbContext.Customers.Include("Orders")
                                  .Where(o => o.Orders.OrderID == 2);

通常、ナビゲーションプロパティは遅延読み込みされ、コードでアクセスされるまでオブジェクトはエンティティのプロパティに含まれません。Includeメソッドを使用して使用することがわかっている場合は、フレームワークにすぐにロードするように手動で指示できます。この例のこのメソッドは、Orders.OrderID値にアクセスするために必要ではありません。

于 2012-04-11T05:43:09.030 に答える
0

同様の質問がある人のための将来の参考のために、EFが実際に何を生成するかを確認する必要がありました。明らかに、EFは、交差点エンティティが非表示になっているときに必要に応じて結合を追加するのに十分スマートです。

var query = from c in db.Clients
from o in db.Orders
where c.Id == 1 
select o.Id;

次のSQLを生成します:

SELECT
[Extent2].[Id] AS [Id]
FROM  [dbo].[Client] AS [Extent1]
CROSS JOIN [dbo].[Order] AS [Extent2]
WHERE 1 = [Extent1].[Id]
于 2012-04-12T06:11:03.077 に答える