2011-10-05 8 views
80

私はいくつかのEntity Frameworkアプリケーションを設計する前に、いくつかのWebキャストを見ていました。私は本当に多くのドキュメントを読んでいなかったので、今は苦しんでいるような気がします。ICollection <T> Vsリスト

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

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

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

いずれにしても、私が行ったことには何か悪い点がありますか、それとも変更する必要がありますか?

答えて

79

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

はまた、あなたICollection<T>を使用しては、あなたが単にList<T>実装として公開されたことに注意してください。 List<T>はそれに伴いIList<T>,ICollection<T>IEnumerable<T>となります。

あなたの変更については、List<T>が動作しているにもかかわらず、インターフェイス経由で公開することをお勧めします。インタフェースは契約を定義しますが、実装は定義しません。実装に変更できます。場合によっては、おそらく実装はHashSet<T>である可能性があります。これは、Entity Frameworkだけでなく、単にEntity Frameworkだけで使用できる考え方です。オブジェクト指向の良い練習は、実装ではなくインターフェイスに向けてプログラムすることです。実装は変わりますが、実装は変わる可能性があります)

+1

....私はさらに少し理解するだけのために - リストのIListを継承し、いるICollectionを継承し、IEnumerableを継承します? – wil

+1

はい、チェーンです。 'List 'は継承階層のために、これらの各インタフェース(IList '、' ICollection '、' IEnumerable ')を実装しなければなりません。補完のために、 'IList 'は非汎用的な 'IList'、' ICollection'と 'IEnumerable'インターフェースも取り上げます。 –

+0

ありがとうございます... Ixxx機能のいくつかは、まだ私の理解を逃れる!しかし、他のIxxがIEnumerableを継承していれば、あなたはIenumerableが読み込み専用であればIEnumerableにどのように追加されますか? ...それはあまりにも複雑な場合は、心配しないでください、私は少し時間があるとき、私はリフレクターを起動しようとします! – wil

40

Entity FrameworkがLinqを使用するときに実行する魔法のクエリよりもわかりやすい抽象化を提供しています。ここで

は、インターフェースの違いです:

  • IEnumerable<T>
  • 読み取り専用されてあなたはICollection<T>
  • に項目を追加したり削除することができますあなたはList<T>
  • に(インデックスで)ランダムアクセスを行うことができます

これらのうち、ICollectionIEnumerableは、エンティティを削除することは、DBで行うことです。

インデックスによるランダムアクセスも同様にマップされません。繰り返し処理するために既存のクエリ結果を持たなければならないか、ランダムアクセスごとにデータベースに再度クエリが行われるためです。また、インデックスはどのようにマップされますか?行番号?あなたがやりたい行番号のクエリがたくさんありませんし、より大きなクエリを構築するのには全く役に立ちません。だから彼らは単にそれをサポートしていません。

ICollection<T>がサポートされているため、データのクエリと変更の両方を行うことができますので、それを使用してください。

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

8

ICollectionは、コレクションに項目を実際に追加できる点でIEnumerableと異なりますが、IEnumerableではアイテムを追加できません。たとえば、POCOクラスでは、コレクションの追加を許可する場合はICollectionを使用します。 ICollectionを遅延ロードの恩恵を受けるように仮想化します。

+1

私は理解したいと思います - リストを使って、同じ操作(そしてもっと!)をすることができます。なぜICollection ?なぜリストなし?よりシンプルで強力です。 – monstro

+0

リスト ICollectionとIEnumerableを実装します。より多くの操作が、それによりオーバーヘッドが増えます。 –

2

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

最近の[2015] CodeProjectの記事では、のサンプルコードを使用して詳細とグラフィック表現の違いを説明しています。これは、EFに直接焦点を当てたが、それでも、それは大きな助けになることを願っていません。

のでList vs IEnumerable vs IQueryable vs ICollection vs IDictionary

関連する問題