初めて .NET で Entity Framework を使用し、モデルから情報を取得するために LINQ クエリを作成しました。最初から良い習慣でプログラミングしたいと思っているので、これらのクエリをどのように記述して結果を得るのが最善かを研究しています。残念ながら、Stack Exchange を閲覧していると、遅延/即時実行が LINQ でどのように機能するかについて、矛盾する 2 つの説明に出くわしたようです。
- foreach により、ループの各反復でクエリが実行されます。
問題のデモンストレーションLINQ クエリで foreach() が遅い - ToList() はパフォーマンスを大幅に向上させます - これはなぜですか? これは、foreach がデータ ソースのクエリを繰り返し評価しているため、クエリをすぐに評価するために "ToList()" を呼び出す必要があることを意味し、操作が大幅に遅くなります。
もう 1 つの例は、グループ化されたlinq の結果による Foreaching が信じられないほど遅いという質問です。ヒントはありますか? 、受け入れられた回答は、クエリで「ToList()」を呼び出すとパフォーマンスが向上することも意味します。
- foreach はクエリを 1 回実行するため、LINQ で安全に使用できます。
問題のデモンストレーションforeach はクエリを 1 回だけ実行しますか? の場合、foreach によって 1 つの列挙が確立され、毎回データソースにクエリが実行されないことを意味します。
サイトのブラウジングを続けると、「foreach ループ中の繰り返し実行」がパフォーマンスの問題の原因であるという多くの質問と、foreach がデータソースから単一のクエリを適切に取得することを示す他の多くの回答が見つかりました。説明には妥当性があるようです。「ToList()」仮説が正しくない場合 (2013 年 6 月 5 日午後 1 時 51 分 EST 時点での現在の回答のほとんどが暗示しているようです)、この誤解はどこから来るのでしょうか? これらの説明のうち、正確なものとそうでないものがありますか?それとも、LINQ クエリの評価が異なる原因となるさまざまな状況がありますか?
編集:以下の受け入れられた回答に加えて、プログラマーに関する次の質問を見つけました。これは、クエリの実行、特にループ中に複数のデータソースにヒットする可能性のある落とし穴を理解するのに非常に役立ちました。この質問に興味のある他の人に役立つ: https://softwareengineering.stackexchange.com/questions/178218/for-vs-foreach-vs-linq