我正在使用VS2017来创建ASP.NET Web应用程序(不使用CORE),. NET Framework是4.6.2,实体框架.NET是6.1.3。我一直在这里寻找答案,但是我尝试过或提到的所有内容均不可用。

我现在有以下代码来获取特定父母的孩子的孙子孙,我知道必须有一种更有效的方法来获取那些孙子孙,但无法弄清楚如何做:

            using (_ge = new generation_entities())
        {
            if (_id != null)
            {
                List<scheduleheader> _tlist = (from a in _ge.scheduleheaders.Include("scheduledetails") where a.programID == _id select a).ToList();
                foreach (scheduleheader _t in _tlist)
                {
                    foreach (scheduledetail _s in _t.scheduledetails)
                    {
                        _s.scheddtlcustoms = (from a in _ge.scheddtlcustoms where a.dtlID == _s.dtlID select a).ToList();
                        _s.scheddtlstandards = (from a in _ge.scheddtlstandards where a.dtlID == _s.dtlID select a).ToList();
                        _s.scheddtltalks = (from a in _ge.scheddtltalks where a.dtlID == _s.dtlID select a).ToList();
                        _s.scheddtlvenues = (from a in _ge.scheddtlvenues where a.dtlID == _s.dtlID select a).ToList();
                        _s.scheduledtlrecurrences = (from a in _ge.scheduledtlrecurrences where a.dtlID == _s.dtlID select a).ToList();
                    }
                }
                return _tlist;
            }
            else
                return (from a in _ge.scheduleheaders where a.scheduledetails.Any(b => b.start > DateTime.Today.AddDays(-30)) && a.programID == null select a).ToList();
        }


我尝试使用.ThenIncludeInclude("xxxx.xxxx.xxxx"),但是.ThenInclude甚至对我都不可用,并且Include("xxxx.xxxx.xxxx")仅适用于一个孙子。 Include()仅允许我输入字符串路径,但我已经看到注释,说明OP使用的是较旧版本的EF。

我对此感到困惑,如果我在这里遗漏了东西,可以给我启发吗?

最佳答案

您可以链接另一个答案中指出的多个Include("xxxx.xxxx.xxxx")

但是,这将用单个但不常见的SQL查询将当前parents.Count * children.Count * grandChildrenTypes.Count数量的SQL查询替换为单个结果集中的所有列和所有记录,这可能也不是很有效。

我建议您使用一种混合方法(类似于EF Core处理Include的方法),该方法将为每个父级执行1条SQL,为每个子级执行1条SQL,为每个孙子级类型执行1条SQL,即在这种情况下总共执行7条SQL查询。仅将父查询结果存储到变量中,子查询和孙子查询才被执行,并且整个肮脏的工作都由EF导航属性修复完成:

// Load parents
var parentQuery = _ge.scheduleheaders.Where(a => a.programID == _id);
var parents = parentQuery.ToList();
// Load children
var childQuery = parentQuery.SelectMany(p => p.scheduledetails);
childQuery.Load();
// Load grandchildren
childQuery.SelectMany(c => c.scheddtlcustoms).Load();
childQuery.SelectMany(c => c.scheddtlstandards).Load();
childQuery.SelectMany(c => c.scheddtltalks).Load();
childQuery.SelectMany(c => c.scheddtlvenues).Load();
childQuery.SelectMany(c => c.scheduledtlrecurrences).Load();
// Done
return parents;

关于c# - 从Entity Framework .NET返回父项的多个子孙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46856286/

10-13 06:45