我正在使用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();
}
我尝试使用
.ThenInclude
和Include("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/