web-dev-qa-db-ja.com

Entity FrameworkのICollection <T> Vs List <T>

いくつかのEntity Frameworkアプリケーションの設計に取り掛かる前に、私はほんのいくつかのウェブキャストを見ました。それほど多くのドキュメントを読んでいなかったので、今は苦しんでいるように感じます。

私はクラスでList<T>を使用してきましたが、うまく機能しました。

今、私はいくつかのドキュメントを読みましたが、ICollection<T>を使用すべきだったと述べています。これに変更しましたが、モデルコンテキストの変更さえ引き起こしませんでした。これは、List<T>ICollection<T>の両方がIEnumerable<T>を継承し、それがEFに実際に必要なものだからですか?

しかし、これが当てはまる場合、EFドキュメントではIEnumerable<T>ではなくICollection<T>が必要であると記載されていないのはなぜですか?

いずれにせよ、私がやったことの欠点はありますか、それを変更する必要がありますか?

97
wil

Entity Frameworkは、ICollection<T>インターフェイスの一部ではないAdd操作をサポートする必要があるため、IEnumerable<T>を使用します。

また、wereを使用してICollection<T>であり、単にList<T>実装として公開していることに注意してください。 List<T>は、IList<T>ICollection<T>、およびIEnumerable<T>を伴います。

変更に関しては、List<T>が機能しているにもかかわらず、インターフェースを介して公開することをお勧めします。インターフェイスはコントラクトを定義しますが、実装は定義しません。実装could変更。場合によっては、たとえば、実装はHashSet<T>になります。 (ちなみに、これはEntity Framework以外にも使用できる考え方です。オブジェクト指向の実践としては、実装ではなくインターフェイスに向けてプログラミングすることです。実装は変更される可能性があります。

98
Anthony Pegram

Linqを使用するときにEntity Frameworkが実行するマジッククエリを包括的に抽象化できるため、彼らが行ったインターフェイスを選択しました。

インターフェースの違いは次のとおりです。

  • IEnumerable<T>は読み取り専用です
  • ICollection<T>にアイテムを追加および削除できます
  • List<T>への(インデックスによる)ランダムアクセスを行うことができます

これらのうち、ICollectionIEnumerableはデータベース操作にうまくマッピングされます。エンティティのクエリと追加/削除はDBで行うことができるためです。

既存のクエリ結果を反復処理する必要があるため、インデックスによるランダムアクセスもマッピングされません。そうしないと、各ランダムアクセスによってデータベースが再度クエリされます。また、インデックスは何にマップしますか?行番号?実行したい行番号クエリは多くありません。また、大きなクエリを作成する際にはまったく役に立ちません。そのため、彼らは単にそれをサポートしていません。

ICollection<T>がサポートされており、データのクエリと変更の両方が可能になるため、それを使用します。

List<T>が最初から機能する理由は、EF実装が最終的に1を返すためです。しかし、それはクエリチェーンの最後であり、最初ではありません。そのため、プロパティをICollection<T>にすると、使用するLinqの各レベルに対してクエリを実行するのではなく、EFが一連のSQLを作成し、最後にList<T>のみを返すことがより明確になります。

47

ICollectionはIEnumerableとは異なり、IEnumerableではできないのに対して、実際にコレクションに項目を追加できます。たとえば、POCOクラスでは、コレクションの追加を許可する場合にICollectionを使用します。 ICollectionを仮想化し、遅延読み込みの恩恵も受けます。

8
Ralph Lavelle

質問は何年も前に投稿されましたが、誰かが同じシナリオを探しているとき、それはまだ有効です。

最近の[2015] CodeProjectの記事には、サンプルコードによる詳細とグラフィック表示の違いについて説明しています。 EFに直接焦点を合わせているわけではありませんが、さらに大きな助けになることを願っています。

リストvs IEnumerable vs IQueryable vs ICollection vs IDictionary

3
BiLaL