IQueryable< T> vs IEnumerable< T>ラムダで、どちらを選択しますか?
質問
Lambdaでますます練習しますが、なぜIQueryableを使用する .AsQueryable();
を使用し、 .AsQueryable()を省略しているのかがわからない
およびIEnumerableを使用します。
MSDN を読みましたが、その方法がわかりません「式ツリーの実行」ないよりも有利です。
誰でも私にそれを説明できますか?
解決
IQueryableはIEnumerableを実装しているため、すぐにIQueryableを使用して、IEnumerableでできることをすべて実行できます。 IQueryablesは、一部のラムダ式を基になるデータソースのクエリに変換します。これは、SQLデータベースまたはオブジェクトセットです。
基本的に、IQueryableまたはIEnumerableである場合、通常は何らかの方法で気にする必要はありません。
他のヒント
ユーザーとしては、通常、気にする必要はありません。実際にはデータソースの実装者に関するものです。データプロバイダーがIEnumerableを実装している場合、基本的にはオブジェクトの実行に対してLINQを実行しています。つまり、コレクションのメモリ操作にあります。 IQueryableは、データソースに、式が実行されると(通常は列挙によって)式ツリーを実行用の代替表現に変換する機能を提供します。これは、Linq2Sql、Linq2Xml、Linq2Entitiesの機能です。
IQueryableはExpressionを公開しているため、エンドユーザーが気にかけているのを見ることができるのは、実行されるExpressionツリーを検査したい場合だけです。別の用途として、プロバイダーの検査があります。ただし、これらのシナリオは両方とも、他のクエリプロバイダーの実装者のために予約されており、式を変換する必要があります。 Linqのポイントは、使用する式の実行の実装を気にする必要がないことです。
Arne Claassenに同意します。データソースによって提供される基礎となる実装を考慮する必要がある場合があります。たとえば、このブログをチェックしてください。 post は、IEnumerableとIQueryableによって生成されるSQLが特定のシナリオでどのように異なるかを示しています。