8

私は2つのエンティティとの1対多の関係を持っています:

Order:
int OrderId 
string OrderNumber
...

OrderItem:
int ItemId
int sequence
...

Product:
int ProductId
string ProductName

ProductType:
int ProductTypeid
string Title

OneにはOrder複数OrderItemsがあり、それぞれOrderItemに One がProductあり、それぞれProductに 1 つがありProductTypeます。

itemsProductProductTypeおよびアイテムを含むすべての注文をシーケンスフィールドでソートする Linq を作成したいと考えています。次のクエリのようなクエリを作成するにはどうすればよいですか?

Order by with Linqの助けを借りて、次のクエリを作成しました。

var myOrder= db.Orders.Include("OrderItems")
         .Where(x => x.OrderId == 3)
         .Include("OrderItems.Product") 
         .Include("OrderItems.Product.ProductType") 
         .Select(o => new {
             order = o,
             orderItems = o.OrderItems.OrderBy(i => i.sequence)
         }).FirstOrDefault();

ただし、結果を返すとき、Product および ProductType data は含まれていません。私の間違いはどこですか?

4

1 に答える 1

4

Include()すべての呼び出しを最初に行う必要があります。これは機能するはずです:

var myOrder= db.Orders.Include("OrderItems")
     .Include("OrderItems.Product") 
     .Include("OrderItems.Product.ProductType") 
     .Where(x => x.OrderId == 3)
     .Select(o => new {
         order = o,
         orderItems = o.OrderItems.OrderBy(i => i.sequence)
     }).FirstOrDefault();

また、を持っている場合は.Include("OrderItems.Product.ProductType")、とは必要.Include("OrderItems")ありません.Include("OrderItems.Product")。これは、商品タイプを含める途中でOrderItemとその商品が含まれるためです。これを行う必要があります。そうしないと、コードでそれらに移動できなくなります。それらを何にアタッチしますか?

この場合、これが説明しているように見えます:http ://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

インクルードを使用せずに回避できます。

var query = db.Orders
.Where(x => x.OrderId == 3)
.Select(o => new {
order = o,
orderItems = o.OrderItems.OrderBy(i => i.sequence),
products = o.OrderItems.Select(i => new { i, i.Product, i.Product.ProductType })
});

出力選択に投影するものはすべて、自動的に熱心にロードされます。完全なオブジェクトグラフではなく、必要なものだけを具体化するため、このような積極的な読み込みは、実際にはいくつかの点で望ましいです。(ただし、この場合、インクルードと同じように実体化します。)

于 2013-01-23T10:27:18.483 に答える