如何使用Entity Framework 7 linq查询加载嵌套在类中的所有级别的对象?

时间:2016-05-17 20:48:23

标签: c# .net entity-framework linq

我正在使用Entity Framework 7来映射我的应用程序的数据访问。

以下是我使用的课程示例:

[Table("class1")]
public class Class1
{
    public int id { get; set; }
    public int randomProp1 { get; set; }
    public int randomProp2 { get; set; }

    public ICollection<Class2> collectionClass2 { get; set; }
    public ICollection<Class3> collectionClass3 { get; set; }
}

[Table("class2")]
public class Class2
{
    public int id { get; set; }
    public int idClass1 { get; set; }
    public int randomProp { get; set; }

    [ForeignKey("idClass1")]
    public Class1 class1 { get; set; }
}

[Table("class3")]
public class Class3
{
    public int id { get; set; }
    public int randomProp { get; set; }
    public int randomProp2 { get; set; }
    public int idClass2 { get; set; }

    [ForeignKey("idClass1")]
    public Class1 class1 { get; set; }

    public ICollection<Class4> collectionClass4 { get; set; }
}

[Table("class4")]
public class Class4
{
    public int id { get; set; }
    public int idClass3 { get; set; }
    public int randomProp4 { get; set; }

    [ForeignKey("idClass3")]
    public Class3 class3 { get; set; }
}

我想要获得所有这些结构。为此,我有以下方法:

public List<Class1> GetAll()
{
    return _ctx.Class1
                .Include(x => x.collectionClass2)
                .Include(x => x.collectionClass3)
                .Include(x => x.collectionClass3.Select(c => c.collectionClass4))
                .ToList();
}

但是,当我尝试执行此方法时,我得到以下异常:

  

类型&#39; System.InvalidCastException&#39;的例外情况发生在EntityFramework.Core.dll但未在用户代码中处理   附加信息:无法转换类型为&#39; Remotion.Linq.Clauses.Expressions.SubQueryExpression&#39;的对象输入&#39; System.Linq.Expressions.MemberExpression&#39;。

如果从查询中删除.Include(x => x.collectionClass3.Select(c => c.collectionClass4)),它将检索数据,但嵌套在class3中的class4集合将作为null属性。

我还尝试将.ThenInclude(x => x.Select(c => c.collectionClass4))放在互联网上的一些示例中,但它会出现以下异常:

  

类型&#39; System.ArgumentException&#39;的例外情况发生在EntityFramework.Core.dll但未在用户代码中处理   附加信息:属性表达式&#39; x =&gt; {来自Class3 c in x select [c] .collectionClass4}&#39;无效。表达式应代表属性访问权限:&#39; t =&gt; t.MyProperty&#39 ;.指定多个属性时,请使用匿名类型:&#39; t =&gt;新{t.MyProperty1,t.MyProperty2}&#39;。

1 个答案:

答案 0 :(得分:1)

ThenInclude位于Include之后,表示必须同时包含嵌套对象:

.Include(x => x.collectionClass3)
    .ThenInclude(x => x.collectionClass4)