1. ホーム
  2. linq

[解決済み] IQueryableとIEnumerableの違いは何ですか[重複]。

2022-04-26 12:05:56

質問

違いがわからず戸惑っています。 .Netのかなり新しいユーザーである私は、以下のようなクエリを実行できることを知っています。 IEnumerables Linq 拡張を使用しています。 では、次のものは何でしょうか。 IQueryable とはどのような違いがあるのでしょうか?


こちらもご覧ください IQueryable[T]とIEnumerable[T]の違いは何ですか? は、この質問と重複しています。

どのように解決するのですか?

IEnumerable<T> の前方のみのカーソルを表します。 T . .NET 3.5では、拡張メソッドに LINQ standard query operators のように WhereFirst で、述語を必要とする演算子や無名関数は Func<T> .

IQueryable<T> は同じLINQ標準のクエリ演算子を実装していますが、その代わりに Expression<Func<T>> を述語と無名関数に使うことができます。 Expression<T> はコンパイルされた式木で、メソッドの分解されたバージョン (必要であれば "half-compiled") で、クエリブルのプロバイダによって解析され、それに応じて使用されることが可能です。

例えば

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 は、各人に対して一度ずつメソッドを実行します。 yield メソッドが返した値を true .

2つ目のブロックでは x => x.Age > 18 は式木( Expression<Func<Person, bool>> ) であり、これは "is 'Age' property > 18" と考えることができます。

これにより、LINQ-to-SQLのようなものが存在し、式木をパースして同等のSQLに変換することができるからです。また、プロバイダは IQueryable が列挙され(それは IEnumerable<T> また、複数のクエリ演算子を組み合わせることができます (上の例では WhereFirstOrDefault を使うなど)、基礎となるデータソースに対してクエリ全体を実行する方法をよりスマートに選択できるようになります。 SELECT TOP 1 を SQL で使用する場合)。

ご覧ください。