我从未听说过,但人们将应用程序中的问题称为“N+1 问题”。他们正在做一个基于 Linq to SQL 的项目,并且有人发现了一个性能问题。我不太明白 - 但希望有人可以指导我。
似乎他们正在尝试获取对象列表,然后之后的 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));
}
似乎已确定的问题是,他们希望“程序”包含它的孩子。但是当我们在查询中引用孩子时,它会重新加载程序:
program.Program_Phases
他们期望程序完全加载并在内存中,并且profilder 似乎表明该程序表,所有连接都在每个“foreach”上被调用。
这有意义吗?
(编辑:我找到这个链接: linq to sql 自动延迟加载关联实体吗? 这可能会回答我的问题,但是.. 他们使用的是更好的(其中人在......)符号,而不是这个奇怪的 (x => x....)。因此,如果此链接是答案-即,我们需要在查询中“加入”-可以这样做吗?)