EF6中相关数据的高效查询

问题描述

我的模型中有一个名为TrainingProgram的复杂对象。一个TrainingProgram(以及其他)包括一个TrainingBlocks集合,这些集合又包含ExercisePairings的集合。每个EercisePairing都有一个“练习”列表,以及一些其他数据(此处不相关)。我可以通过遍历数据集并将所有内容显式加载到上下文中,通过EF6从数据库查询程序:

dbcontext.Entry(trainer).Collection(a => a.Programs).Load();
                        foreach (TrainingProgram p in trainer.Programs)
                        {
                            dbcontext.Entry(p).Collection(a => a.Blocks).Load();
                            foreach (TrainingBlock b in p.Blocks)
                            {
                                dbcontext.Entry(b).Collection(a => a.Circuits).Load();
                                foreach (ExercisePairing c in b.Circuits)
                                {
                                    dbcontext.Entry(c).Collection(a => a.Progressions).Load();
                                    foreach (var prog in c.Progressions)
                                    {
                                        dbcontext.Entry(prog).Reference(a => a.Exercise).Load();
                                        dbcontext.Entry(prog).Reference(a => a.Progression).Load();
                                    }

                                    dbcontext.Entry(c).Collection(a => a.Sets).Load();
                                    foreach (ExerciseSet s in c.Sets)
                                    {
                                        dbcontext.Entry(s).Reference(x => x.Exercise).Load();
                                        dbcontext.Entry(s.Exercise).Reference(x => x.Category).Load();
                                    }
                                }
                            }
                        }

很显然,这导致大量的DB调用,因此降低了效率。为了解决这个问题,我尝试通过使用include和select来执行渴望加载的路线,如下所示:

var pax = dbcontext.TrainingPrograms
                                .Include(x => x.Blocks.Select(xb => xb.Circuits.Select(xc => xc.Sets.Select(xs => xs.Exercise.Category))))
                                .Where(x => x.Id == p.Id)
                                .FirstOrDefault();

尽管这确实返回了相关的集合,但它仅部分返回了。也就是说,它在每个集合中仅返回一个元素,而在上面介绍的迭代方法中,一切都返回正确。

在我发现的所有文档和教程中,从未讨论过嵌套集合。我坚信需要一种优雅而有效的方式来加载我的数据,但似乎无法弄清楚。任何帮助表示赞赏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)