我從來沒有聽說過它,但人們將應用程序中的問題稱爲「N + 1問題」。他們正在做一個Linq to SQL的項目,並且有人發現了一個性能問題。我不太明白 - 但希望有人能引導我。人們問我要修復N + 1錯誤嗎?
看來,他們正試圖獲得obects的列表,然後在Foreach後引起太多的數據庫訪問:
據我瞭解,源的第二部分只被裝載在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));
}
看來idetified的問題是,他們預計「計劃」到包含它的孩子。但是,當我們提到查詢的孩子,它重新加載proram:
program.Program_Phases
他們期待節目是滿載並在內存中,並profilder似乎表明,節目表,所有的連接是被稱爲每個'foreach'。
這是否有意義?
(編輯:我foind此鏈接: Does linq to sql automatically lazy load associated entities? 這可能會回答我的quetion,但..他們使用更好的(如人......)符號,而不是這種奇怪的(X => X ....)。因此,如果這個鏈接是答案 - 即我們需要在查詢中「加入」 - 可以這樣做嗎?)
參見:http://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem –