17

コード例:

List<Student> Students = new List<Student>()   
{   
    new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }),  
    new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }),  
    new Student(103, "Michael", "Tucker", new List<int>() { 73, 80, 75, 88 }),  
    new Student(104, "Fadi", "Fakhouri", new List<int>() { 82, 75, 66, 84 }),  
    new Student(105, "Peter", "Barrows", new List<int>() { 67, 78, 70, 82 })  
};

var query = from student in Students
            where student.Marks.AsQueryable().All(m => m > 70)
            select student;

foreach (Student student in query)
{
    Console.WriteLine("{0} {1}<br />", student.FirstName, student.LastName);
}

しかし、クエリを次のように変更すると

var query = from student in Students
            where student.Marks.All(m => m > 70)
            select student;

これも機能し、同じ結果が得られますが、違いは何ですか?

4

3 に答える 3

10

IQueryable は、リモート ソース (データベースなど) からのオブジェクトに必要/推奨されます。

メモリ内コレクションでは役に立ちません。

式木を構築する場合は、AsQueryableを使用します。

最適なシナリオを考えることができます。あなたの例では、学生IDに基づいてデータベースからいくつかの情報が必要だとしましょう。

今、学生はメモリ コレクションです。学生 ID に基づいてデータベース クエリを起動する必要があります。

  var studentList = Students.Select(s => s.Id).AsQueryAble().Select(i => remoteDBProvider.GetInfo(i));

studentList に対するその他の操作は IQueryAble インターフェイス (クエリ式) から呼び出され、データ ソースからそれらのレコードのみをフェッチします。これは、最終的なクエリ結果として返される必要があります (データ ソースremoteDBProvider.GetInfoが例の戻り値をサポートしている限り)。クエリプロバイダ)。

于 2012-05-09T06:42:31.547 に答える
3

あなたの の場合、返されたは、まったく使用しなかったかのようにクエリに同じメソッドを使用するためList<Student>、違いはありません。 IQueryable<T>AsQueryable()

一部のメソッドはIQueryable<T>パラメーターを必要とします。拡張メソッドは、AsQueryable()を渡す必要があるIQueryable<T>IEnumerable<T>.

MSDN は次のように述べていAsQueryableます。

ソースの型が を実装している場合は、IQueryable<T>それ AsQueryable<TElement>(IEnumerable<TElement>)を直接返します。それ以外の場合は、の代わりにIQueryable<T>の同等のクエリ演算子メソッドを呼び出してクエリを実行する を返します。EnumerableQueryable

つまり、あなたの場合 (List<T>実装していませんIQueryable<T>)、本当に必要ありませんAsQueryable

于 2012-05-09T06:51:16.250 に答える
2

式ツリーがどのように構築されるかを行う必要があります。これを見てください:

AsQueryable は、クエリを IQueryable のインスタンスに変換できるようにするメソッドです。既存のクエリで AsQueryable 演算子を使用し、フィルターの適用や並べ替え順序の指定などのさらなる変換を適用すると、それらのラムダ ステートメントは式ツリーに変換されます。使用しているプロバイダーによっては、式ツリーがドメイン固有の構文に変換されてから実行されます。Linq to SQL プロバイダーの場合、式ツリーは SQL に変換され、SQL サーバー上で実行されます。ただし、IQueryable を実装せず、IEnumerable のみを実装するクエリで AsQueryable 演算子を使用すると、クエリに適用する変換は自動的に IEnumerable 仕様にフォールバックします。これが意味することは、クエリに AsQueryable のタグを付けることで、Linq to SQL と Linq to object 実装の両方の利点を得ることができるということです。既存のクエリがたまたま IQueryable を実装している場合、クエリは Linq to SQL プロバイダーによって SQL に変換されます。それ以外の場合、クエリは IL コードの形式でメモリ内で実行されます。

ここを参照

于 2012-05-09T06:39:26.723 に答える