2016-04-26 9 views
1

この2つのクエリは機能的に同等ですか?"AsEnumerable()"等価を含むLinqクエリ

1)

var z=Categories 
     .Where(s=>s.CategoryName.Contains("a")) 
     .OrderBy(s => s.CategoryName).AsEnumerable() 
     .Select((x,i)=>new {x.CategoryName,Rank=i}); 

2)私が意味

var z=Categories.AsEnumerable() 
     .Where(s=>s.CategoryName.Contains("a")) 
     .OrderBy(s => s.CategoryName) 
     .Select((x,i)=>new {x.CategoryName,Rank=i}); 

は、クエリ内のクライアントから取得したデータ項目の数を変更するか、 "AsNumerable()" の順序を行い彼らは取り戻されますか?

ありがとうございました。

+0

はい、順序は重要です。参照:http:// stackoverflow。com/questions/3311244/understanding-asenumerable-in-linq-to-sql –

+0

これはLINQプロバイダに依存しますが、どちらを使用しているのかは指定していません。 LINQ to SQL?エンティティフレームワーク?他に何か? – hvd

+0

LINQ to SQL ...、私はそれを言う必要があります。 –

答えて

3

この2つのクエリは機能的に同等ですか?

最終的な結果を意味する場合は、プロバイダがこれらの操作をどのように実装しているかに応じて、おそらくはいです。その違いは、メモリ内拡張を使用している2番目のクエリにあります。私が意味する

、クエリ内の「AsNumerable()」の順序は、クライアントから取得したデータ項目の 数、またはそれらは を取得している方法を変更しますか?

はい、最初のクエリでは、WhereOrderBySQLに変換されますとSelectは、メモリ内で実行されます。

2番目のクエリでは、データベースからのすべての情報がメモリに持ち込まれ、フィルタリングされ、メモリに変換されます。


CategoriesおそらくIQueryableあるので、あなたはQueryableクラスでの拡張機能を使用することになります。このバージョンの拡張機能はパラメータとしてExpressionを受け取り、これらの式ツリーはコードをSQLクエリに変換できるものです。

AsEnumerable()はオブジェクトをIEnumerableとして返します。そのため、メモリ内で直接実行されるクラスの拡張を使用します。

+3

'同等の場合は、最終的な結果ですが、違いはメモリ内の拡張機能を使用している2番目のクエリにあります;これは必ずしも真実ではありません。クエリプロバイダは、これらの操作のメモリ内の同等物とわずかに(または、場合によってはそれほど大きく)異なるセマンティクスを持つことが可能です。 – Servy

+0

@Servy:それは本当です、答えを更新しました。 –

+2

また、 'AsEnumerable'はコレクションを"変換 "せず、コンパイラに' IQueryable'の代わりに 'IEnumerable'拡張メソッドへの従属呼び出しを強制します。 –

1

はい彼らは同じことをしますが、異なる方法で行います。最初のクエリは、SQLデータベース自体のすべての選択、順序付け、および条件を実行します。

ただし、2番目のコードセグメントはデータベースからすべての行をフェッチし、メモリに格納します。次に、ソートし、注文し、取り込んだデータに条件を適用します。ある

  1. インサイド・パート(AsEnumerable前クエリ)LINQからSQLへ
  2. 外-パート(AsEnumerable後のクエリ)として実行されます。

    AsEnumerable()は二つの部分にクエリを破りますLINQ-to-Objectsとして実行されます。