考えられている: -はなぜのIQueryableでカウントを使用しては実現不可能
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
をそれからそれはのIQueryableオブジェクトをカウントするなど実現不可能と考えられ、IEnumerableをを使用して良いですか? BR
考えられている: -はなぜのIQueryableでカウントを使用しては実現不可能
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
をそれからそれはのIQueryableオブジェクトをカウントするなど実現不可能と考えられ、IEnumerableをを使用して良いですか? BR
あなたは誤解されています。
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を使用するように切り替える拡張メソッド。
は私がのIQueryableのinfeasabilityに慣れていないんだけど、IQueryableを基礎となる表現へのアクセスを可能にするためのIQueryableがはるかに望ましいのIEnumerableにあることを示すためにthis blog postようです。
これは、Where句の場合のみ関連し、.Count()には影響しません。
私の場合ではないにしても、Excel文書の実行回数はパフォーマンスにあまり良くありません。約350行で300〜400ミリ秒。あなたの説明をありがとう。なぜそれが遅いのか理解できるように助けてくれました。 –