2017-04-05 13 views
1

この質問は、どちらのアプローチが優れているのか、それとも全く重要でないのかについてです。だから、私はそう常にナビゲーションプロパティを使用するか、.Whereクエリを使用する必要がありますか?

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Category> Categories { get; set; } 
} 

と問題がある

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Item> Items { get; set; } 
} 

参照される1つのカテゴリーのようなクラス項目を持っていると言うとき、カテゴリをユーザーがクリックすると、そのカテゴリ内のすべての項目リストに出力する必要がありますので、その項目のカテゴリを行う必要があります。

私は

_context.Items.Where(c => c.Category.Id == id); 

のようなものを使用し、仮想メンバを削除することができます。だから、唯一の

{ 
    "Id": 1, 
    "Name": "String", 
    "Category": [ 
     { 
     "Id": 1, 
     "Name": "CName", 
     "Items": [] 
     }, 
     { 
     "Id": 1, 
     "Name": "CName", 
     "Items": [] 
     } 
    ] 
} 

:私はクライアントのためのアイテムテーブルのJSONデータを取得するためにWEBAPIを使用する場合、それはこのようなものを出力するので、私はこれを聞いて、私は「欲しい」なぜそのメンバーを削除するには、なぜ 理由がありますCategoryモデルのナビゲーションプロパティを持つ問題は、アイテムのリストを要求するときに、この「アイテム」[:]も私に送信するということです。 それは私や何かに影響を与えているようなものではないので、私はNavigationアプローチか.Whereアプローチを使用すべきかどうかを知りたい。それとも、私は考慮すべき他の方法がありますか?

+1

個人的には、クエリのナビゲーションプロパティを使用して、匿名クラスまたはシリアル化されるカスタムクラスのいずれかにプロジェクト/選択することをお勧めします。 – juharr

答えて

3

常にナビゲーションプロパティを使用してください。 EFはあなたよりもはるかに効率的なクエリを生成することができます(おそらく、少なくとも)。そのも多くの読みやすい。

と言われています。 ではないは、EFオブジェクトをデータコントラクトとして使用します。シリアライザを介して実行すると、の中で最も良いのはケースです。上記のことを行い、一般的なケースでは循環参照例外が発生します。

契約書は個別に定義して、循環参照が存在しないようにする必要があります。 Selectを使用して、コレクションをDBタイプからAPIタイプに変換します。

+0

プロパティを保持する必要がありますが、シリアル化に使用する別のクラスを作成する必要がありますか?そのクラスにアイテムへの参照が含まれている必要があります(これも転送オブジェクトになります)。 –

+1

@ E.Hoxhaはい。それはまさに典型的なアプローチです。アイテムは、親に戻ってnavプロパティを持たない別の転送オブジェクトになります(循環参照を防止するため) – BradleyDotNET

+0

ここでまともな読書をしてください:http://broloco.blogspot.com/2009/02/sending-domain-objects -across-wire.html私はPOCOの最初のEFをやると、それらをワイヤを通して送ることができました。しかし、プロジェクトがPOCOではない最初のEFであれば、私はDTOを提案して作成していますが、それはより多くのビューモデルの味を持っています。 – granadaCoder

関連する問題