从实体框架.NET返回多个孙子孙子的父代
问题描述:
我正在使用VS2017创建一个ASP.NET Web应用程序(不使用CORE),.NET Framework是4.6.2,实体框架.NET是6.1。 3。我在这里看到了我的答案,但是我所尝试或提到的所有内容都不适用于我。从实体框架.NET返回多个孙子孙子的父代
我有以下代码现在获取特定父的孩子孙子,我知道必须有获得这些孙子的更有效的方式,但无法弄清楚如何:我
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查询,但将怪异的SQL查询合并到单个结果集中的所有列和所有记录中,这也可能效率不高。
我会建议你一种混合的方法(类似于EF核心流程的Include
S上的方式),这将在这种特殊情况下共有7个执行每父母1个SQL,1%的儿童和1元每孙子型,即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;
答
你可以尝试这样的:
var query = context
.Parents
.Include(p=>p.children)
.Include(p=>p.children.Select(x=>x.Grandchild1))
.Include(p=>p.children.Select(x=>x.Grandchild2))
.ToList();
你可以用linq
访问它,你可能有一个id,你可以这样做:
var grandchild6 = query
.children
.FirstOrDefault(child=>child.Id =1)
?.GranChildern
?.FirstOrDefault(grandChild=>grandchild.Id = 6);
我要试试这个,我会让你知道它是如何工作的。 – mattgcon