IQueryable と IEnumerable の違いは何ですか [重複] 質問する

IQueryable と IEnumerable の違いは何ですか [重複] 質問する

違いがよくわかりません。.Net を使い始めたばかりですが、IEnumerablesLinq 拡張機能を使用してクエリを実行できることは知っています。では、これは何でありIQueryable、どう違うのでしょうか?


参照IQueryable[T]とIEnumerable[T]の違いは何ですか?それはこの質問と重複します。

ベストアンサー1

IEnumerable<T>は、 の順方向専用カーソルを表します。.NET 3.5 では、や などTの拡張メソッドが追加され、述語を必要とする演算子や を取る匿名関数も追加されました。LINQ standard query operatorsWhereFirstFunc<T>

IQueryable<T>同じ LINQ 標準クエリ演算子を実装しますが、Expression<Func<T>>述語と匿名関数を受け入れます。Expression<T>はコンパイルされた式ツリーであり、クエリ可能なプロバイダーによって解析され、それに応じて使用できるメソッドの分割バージョン (いわゆる「半分コンパイルされた」もの) です。

例えば:

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

最初のブロックでは、x => x.Age > 18は匿名メソッド ( Func<Person, bool>) であり、他のメソッドと同様に実行できます。は、メソッドが返した値を使用してEnumerable.Where、各人に対してメソッドを 1 回実行します。yieldtrue

2 番目のブロックにはx => x.Age > 18式ツリー ( Expression<Func<Person, bool>>) があり、これは「'Age' プロパティは 18 より大きいか」と考えることができます。

これにより、LINQ-to-SQL のようなものが存在できるようになります。これは、式ツリーを解析して同等の SQL に変換できるためです。また、プロバイダーは がIQueryable列挙されるまで実行する必要がないため (結局のところ、 を実装している)、複数のクエリ演算子 (上記の例では と)IEnumerable<T>を組み合わせて、基になるデータ ソースに対してクエリ全体を実行する方法についてよりスマートな選択を行うことができます ( SQL で を使用するなど)。WhereFirstOrDefaultSELECT TOP 1

見る:

おすすめ記事