私は.NETのEntity Frameworkで初めて作業しており、モデルから情報を取得するためにLINQクエリを作成しています。私は初めから良い習慣でプログラムを作りたいので、私はこれらの質問を書いてその結果を得る最善の方法を研究してきました。残念ながら、ブラウジングスタックExchangeで、私は延期/即時実行は、LINQでどのように機能するかに相反する2つの説明に遭遇しているように見えました:"foreach"はLinqの実行を繰り返しますか?
- のforeachループの各反復で実行されるクエリが発生します。
が質問Slow foreach() on a LINQ query - ToList() boosts performance immensely - why is this?で実証、含意はforeachのはかなり動作が遅く、繰り返しデータソースにクエリを評価しているとして「ToListメソッド()は」、すぐにクエリを評価するために呼び出される必要があることです。
もう1つの例は、質問Foreaching through grouped linq results is incredibly slow, any tips?です。受け入れられた回答は、クエリで "ToList()"を呼び出すとパフォーマンスが向上することを意味します。
- foreachのは一度に実行されるクエリが発生し、LINQ 質問 Does foreach execute the query only once?で実証
で使用しても安全である、含意はforeachのが確立されるべき1つの列挙を引き起こすことがある、としません毎回データソースを照会します。
"foreachループ中の繰り返し実行"がパフォーマンス上の懸念の原因であることを多くの疑問が浮き彫りになりました。また、foreachがデータソースから単一のクエリを適切に取得し、両方の説明には妥当性があるようです。 「ToList()」仮説が間違っている場合(2013-06-05の午後1時51分現在のほとんどの現時点での回答が示唆しているように見える)、この誤解はどこから来たのでしょうか?これらの説明のうち正確なものとそうでないものがありますか、LINQクエリの評価方法が異なるさまざまな状況がありますか?
編集:私は以下の質問に答えるだけでなく、ループ中に複数のデータソースがヒットする可能性のある落とし穴https://softwareengineering.stackexchange.com/questions/178218/for-vs-foreach-vs-linq
foreach内のクエリが実際に行っていることに依存すると思います。 – asawyer
'foreach'は、パフォーマンス問題のために' IEnumerable'/'IQueryable'と一緒に使用されると、通常は原因です。 – Aron
これについて適切に判断できるようにするには、非常に具体的な例が必要です。 'foreach'は' GetEnumerator'を一度呼び出すだけですが、 'foreach'ループを複数回実行すると' GetEnumerator'を複数回呼び出します... –