Entity framework 使用实体框架6快速加载孙子对象

Entity framework 使用实体框架6快速加载孙子对象,entity-framework,entity-framework-6.1,Entity Framework,Entity Framework 6.1,我有三门课,看起来像下面的。我会叫他们父母、孩子和孙子 public class Parent { public int Id {get;set;} public string Name {get;set;} public virtual List<Child> Children {get;set;} public virtual List<Grandchild> Grandchildren {get;set;} } public class Chil

我有三门课,看起来像下面的。我会叫他们父母、孩子和孙子

public class Parent 
{
  public int Id {get;set;}
  public string Name {get;set;}
  public virtual List<Child> Children {get;set;}
  public virtual List<Grandchild> Grandchildren {get;set;}
}

public class Child 
{
  public int Id {get;set;}
  public string Name {get;set;}
  public virtual Parent Parent {get;set;}
  public virtual List<Grandchild> Grandchildren {get;set;}
}

public class Grandchild 
{
  public int Id {get;set;}
  public string Name {get;set;}
  public virtual Parent Parent {get;set;}
  public virtual Child Child {get;set;}
}
公共类父类
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟列表子项{get;set;}
公共虚拟列表子对象{get;set;}
}
公营儿童
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟父级{get;set;}
公共虚拟列表子对象{get;set;}
}
公家子弟
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟父级{get;set;}
公共虚拟子对象{get;set;}
}
现在,我使用EF6的存储库模式。对于父级的grab方法,我有如下内容:

public List<Parent> GrabParent(Expression<Func<Parent, bool>> predicate) 
{
  return _context.Parents
    .Include(a => a.Children)
    .Include(a => a.Grandchildren)
    .Where(predicate)
    .ToList();
}
public List<Grandchild> GrabGrandchildren(Expression<Func<Grandchild, bool>> predicate) 
{
  return _context.Grandchildren
    .Include(a => a.Child)
    .Include(a => a.Child.Select(b => b.Parent)
    .ToList();
}
公共列表抓取父对象(表达式谓词)
{
return\u context.Parents
.包括(a=>a.儿童)
.包括(a=>a.孙辈)
.Where(谓词)
.ToList();
}
我使用类似的方法获取孙子记录:

public List<Grandchild> GrabGrandchildren(Expression<Func<Grandchild, bool>> predicate)
{
  return _context.Grandchildren
    .Include(a => a.Parent)
    .Include(a => a.Child)
    .Where(predicate)
    .ToList();
}
公共列表抓取子对象(表达式谓词)
{
return\u context.孙子
.Include(a=>a.Parent)
.Include(a=>a.Child)
.Where(谓词)
.ToList();
}
现在,如果我调用GrabParent方法,我将收到一个父母列表和每个孩子的列表。然而,我无法访问任何孙辈的记录,尽管他们与我能够访问的每个孩子的记录都有关联

类似地,如果我调用Grab孙子方法,我将能够检索孙子的列表和有关子对象的信息,但无法获取有关父对象的任何信息

这是为什么?我如何检索其他相关信息?

有关说明,请参阅

基本上,我会将Grab孙子方法修改为以下内容:

public List<Parent> GrabParent(Expression<Func<Parent, bool>> predicate) 
{
  return _context.Parents
    .Include(a => a.Children)
    .Include(a => a.Grandchildren)
    .Where(predicate)
    .ToList();
}
public List<Grandchild> GrabGrandchildren(Expression<Func<Grandchild, bool>> predicate) 
{
  return _context.Grandchildren
    .Include(a => a.Child)
    .Include(a => a.Child.Select(b => b.Parent)
    .ToList();
}
公共列表抓取子对象(表达式谓词)
{
return\u context.孙子
.Include(a=>a.Child)
.Include(a=>a.Child.Select(b=>b.Parent)
.ToList();
}

对于EF核心,考虑使用这个语法: