2012-02-12 7 views

答えて

20

あなたは誤解されています。

IEnumerableはオブジェクトにLinqを使用し、すべてのメソッドはメモリのオブジェクトで実行されます。 - IQueryableは、特定のプロバイダが提供するLinq拡張メソッドの実装を使用します。このケース(リポジトリ)では、Linq式をデータベースステートメントにマップするプロバイダーである可能性が高いと思います。カウントは、クエリ"select count(*) from People"としてデータベース自体、すなわち上で決定される

IQueryable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

:あなたはIQueryableを使用している場合を意味

。これは通常非常に高速です。

あなたがIEnumerableを使用する場合:LINQのオブジェクトへの回数を決定するために、コレクションを反復している間

IEnumerable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

すべての人々のインスタンスは1でメモリ1にマテリアライズされます。これは非常に遅く、可能な限り避けるべきです。

すべてのメソッド呼び出しをデータベースクエリにマッピングできるわけではないので、IEnumerableを使用することは避けられませんが、できる限りIQueryableですべてのフィルタリング、結合およびグループ化を行う必要があります。最後に、AsEnumerable()オブジェクトにIEnumerableとLinqを使用するように切り替える拡張メソッド。

+0

私の場合ではないにしても、Excel文書の実行回数はパフォーマンスにあまり良くありません。約350行で300〜400ミリ秒。あなたの説明をありがとう。なぜそれが遅いのか理解できるように助けてくれました。 –

0

は私がのIQueryableのinfeasabilityに慣れていないんだけど、IQueryableを基礎となる表現へのアクセスを可能にするためのIQueryableがはるかに望ましいのIEnumerableにあることを示すためにthis blog postようです。

これは、Where句の場合のみ関連し、.Count()には影響しません。

関連する問題