聞いたことはありませんが、人々はアプリケーションの問題を「N+1 問題」と呼んでいます。彼らは Linq to SQL ベースのプロジェクトを行っており、パフォーマンスの問題が誰かによって特定されました。よくわかりませんが、誰かが私を操縦できることを願っています。
彼らはオブジェクトのリストを取得しようとしているようで、その後の Foreach はあまりにも多くのデータベース ヒットを引き起こしています。
私が理解していることから、ソースの 2 番目の部分は forwach にのみロードされています。
したがって、読み込まれたアイテムのリスト:
var program = programRepository.SingleOrDefault(r => r.ProgramDetailId == programDetailId);
そして後で、このリストを利用します。
foreach (var phase in program.Program_Phases)
{
phase.Program_Stages.AddRange(stages.Where(s => s.PhaseId == phase.PhaseId));
phase.Program_Stages.ForEach(s =>
{
s.Program_Modules.AddRange(modules.Where(m => m.StageId == s.StageId));
});
phase.Program_Modules.AddRange(modules.Where(m => m.PhaseId == phase.PhaseId));
}
特定された問題は、「プログラム」にその子が含まれていることを期待していたようです。しかし、クエリで子を参照すると、プログラムがリロードされます。
program.Program_Phases
彼らは、プログラムが完全にロードされてメモリ内にあることを期待しています.profilderは、すべての結合が各「foreach」で呼び出されているプログラムテーブルを示しているようです.
これは理にかなっていますか?
(編集: このリンクを見つけました: linq to sql は関連付けられたエンティティを自動的に遅延ロードしますか? これは私の質問に答えるかもしれませんが、.. この奇妙な (x => x....). したがって、このリンクが答えである場合、つまり、クエリで「結合」する必要がある場合、それは可能ですか?)