2017-06-18 5 views
1

OrderItemのエンティティを持つOrderエンティティがあります。クラスはそのように見えます。マスターからディテールまでの関係

class Order 
{ 
    int Id; 
    string Note; 
    List<OrderItem> OrderItems; 
} 

class OrderItem 
{ 
    int Id; 
    string Name; 
} 

あなたが見ることができるように、OrderはそのOrderItemsOrderItemについて知っているが、そのOrderについて知りません。

問題は、特定のorderに属するOrderItemのコンテキストを照会するlinqクエリをどのように記述するのですか?

+0

私はEFの新機能ですので、ツールについてよくわかりませんが、私はcontext.OrderItems.Where(x => x.Order.Id == 999)を試していました。しかし、これは私が問題に直面したところで、クエリにフィードするプロパティx.Orderはありません。 – Sisyphus

+0

通常、あなたは 'OrderItem'内に' OrderId'を持っています。それはなぜそこにないのですか?あなたはそれらのクラスを執筆しましたか?それらが生成されていれば、私はあなたのデータモデルについて本当に不思議です...あなたがそれらを書いたならば、それが所属するOrderIdを単純に追加してください。今のように、Order.OrderItemsというオーダーに属する、すべてのオーダーアイテムを取得できます。 – oerkelens

答えて

2

var orderItems = context.Orders 
         .Where(o => o.Id == selectedId) 
         .Select(o => o.OrderItems) 
         .ToList(); 

これはあなたのIdをselectedIdとの注文に関連したオーダー・アイテムのリストを与えます。

2

OrderItemクラスにOrderプロパティが必要です。また、あなたは以下のようなあなたのクラスの代わりの分野でpropertiesを使用する必要があります。

public class Order 
{ 
    public int Id { get; set; } 
    public string Note { get; set; } 
    public virtual ICollection<OrderItem> OrderItems { get; set; } 
} 

public class OrderItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Order Order { get; set; } 
} 

はまた、私は virtualキーワードを使用し、代わりにプロパティを作る ListICollectionが遅延ロードをサポートしていることに注意してください。あなたが例えば、(S) OrderItem関連を選択し、正しい Orderを照会します

2

Context.Orders.Where(x => x.Id == 1234).SelectMany(x => x.OrderItems);

か、順序を取得するためにContext.Where(x => x.Id == 1234).Include(x => x.OrderItems)を行うと、その項目を事前に読み込むことができます。

Order.OrderItemsプロパティを仮想化することをお勧めします。少なくとも、事前ロード(または.Include)を忘れてしまった場合、DBからロードされた不整合なデータは取得されません。

関連する問題