これはチュートリアルでよく見られ、ナビゲーション プロパティはICollection<T>
.
これは Entity Framework の必須要件ですか? 使えますIEnumerable
か?
またはのICollection
代わりに使用する主な目的は何ですか?IEnumerable
List<T>
これはチュートリアルでよく見られ、ナビゲーション プロパティはICollection<T>
.
これは Entity Framework の必須要件ですか? 使えますIEnumerable
か?
またはのICollection
代わりに使用する主な目的は何ですか?IEnumerable
List<T>
通常、何を選択するかは、アクセスする必要がある方法によって異なります。一般に - IEnumerable<>
(MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) 反復処理のみが必要なオブジェクトのリストICollection<>
(MSDN: http:// msdn.microsoft.com/en-us/library/92t2ye13.aspx ) 反復処理および変更がList<>
必要なオブジェクトのリスト、反復処理、変更、ソートなどが必要なオブジェクトのリスト (こちらを参照)完全なリストについては、http: //msdn.microsoft.com/en-us/library/6sh2ey19.aspx )。
より具体的な観点から言えば、タイプの選択には遅延読み込みが関係します。既定では、Entity Framework のナビゲーション プロパティには変更追跡が付属しており、プロキシです。動的プロキシをナビゲーション プロパティとして作成するには、仮想型でを実装する必要がありICollection
ます。
リレーションシップの "多く" の端を表すナビゲーション プロパティは、ICollection を実装する型を返す必要があります。ここで、T はリレーションシップの反対側のオブジェクトの型です。- POCO プロキシを作成するための要件MSDN
ICollection<T>
IEnumerable<T>
このインターフェイスでは、項目の追加、項目の削除、またはその他の方法でコレクションを変更する方法が提供されないため、使用されます。
に関する質問への回答List<T>
:
List<T>
クラスです。インターフェイスを指定すると、実装の柔軟性が高まります。より良い質問は、「なぜしないのIList<T>
ですか?」です。
その質問に答えるために、何IList<T>
が追加されているかを考えてみましょうICollection<T>
: 異なるコンテキストでは異なる順序でアイテムを並べる必要があるため、ほとんどの場合、これはおそらく意味がありません。
私はこのように覚えています:
IEnumerable には GetEnumerator() メソッドが 1 つあり、コレクション内の値を読み取ることはできますが、書き込むことはできません。列挙子を使用する際の複雑さのほとんどは、C# の for each ステートメントによって処理されます。IEnumerable には、現在の要素を返す Current という 1 つのプロパティがあります。
ICollection は IEnumerable を実装し、いくつかのプロパティを追加しますが、最もよく使用されるのは Count です。ICollection の汎用バージョンは、Add() メソッドと Remove() メソッドを実装しています。
IList は IEnumerable と ICollection の両方を実装し、アイテムへの整数インデックス アクセスを追加します (順序付けはデータベースで行われるため、通常は必要ありません)。
使用の基本的な考え方はICollection
、有限量のデータへの読み取り専用アクセスへのインターフェイスを提供することです。実際、ICollection.Countプロパティがあります。IEnumerable
論理的なポイント、消費者によって明示的に指定された条件、または列挙の最後まで読み取るデータのチェーンに適しています。
通常、ナビゲーション プロパティは仮想として定義されるため、遅延読み込みなどの特定の Entity Framework 機能を利用できます。
ナビゲーション プロパティが (多対多または 1 対多のリレーションシップのように) 複数のエンティティを保持できる場合、その型は ICollection などのエントリを追加、削除、および更新できるリストである必要があります。
私が過去に行ったことは、リポジトリ内のメソッドで次のいずれかを実行する必要があるかどうかに応じてIList<Class>
、ICollection<Class>
または(静的リストの場合) を使用して内部クラス コレクションを宣言することです:列挙、並べ替え/順序付け、または変更. オブジェクトを列挙する (場合によっては並べ替える) 必要がある場合は、IEnumerable メソッド内でコレクションを操作するための一時ファイルを作成します。このプラクティスは、コレクションが比較的小さい場合にのみ効果的だと思いますが、一般的には良いプラクティスかもしれません.idk. なぜこれが良い習慣ではないのかについての証拠がある場合は、私を修正してください。IEnumerable<Class>
List<Class>