違いがよくわかりません。.Net を使い始めたばかりですが、IEnumerables
Linq 拡張機能を使用してクエリを実行できることは知っています。では、これは何でありIQueryable
、どう違うのでしょうか?
参照IQueryable[T]とIEnumerable[T]の違いは何ですか?それはこの質問と重複します。
ベストアンサー1
IEnumerable<T>
は、 の順方向専用カーソルを表します。.NET 3.5 では、や などT
の拡張メソッドが追加され、述語を必要とする演算子や を取る匿名関数も追加されました。LINQ standard query operators
Where
First
Func<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 回実行します。yield
true
2 番目のブロックにはx => x.Age > 18
式ツリー ( Expression<Func<Person, bool>>
) があり、これは「'Age' プロパティは 18 より大きいか」と考えることができます。
これにより、LINQ-to-SQL のようなものが存在できるようになります。これは、式ツリーを解析して同等の SQL に変換できるためです。また、プロバイダーは がIQueryable
列挙されるまで実行する必要がないため (結局のところ、 を実装している)、複数のクエリ演算子 (上記の例では と)IEnumerable<T>
を組み合わせて、基になるデータ ソースに対してクエリ全体を実行する方法についてよりスマートな選択を行うことができます ( SQL で を使用するなど)。Where
FirstOrDefault
SELECT TOP 1
見る: