加载包含List的嵌套实体

时间:2017-03-20 15:40:53

标签: c# entity-framework linq

我有一个具有子对象列表的对象。我想投影或加载每个子对象中包含的导航属性(多个)。我没有试图过度解释它,而是包括下面的类。

public class Subject
{
    public int SubjectId { get; set; }
    public int SubjectDescription { get; set; }
}

public class Teacher
{
    public int TeacherId { get; set; }
    public string TeacherName { get; set; }
}

public class StudentTimetableEntry
{
    public int StudentTimetableEntryId { get; set; }
    public int ClassId { get; set; }
    public Teacher ClassTeacher { get; set; }
    public Subject ClassSubject { get; set; }
}

public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public List<StudentTimetableEntry> TimetableEntries { get; set; }
}

然后我想加载一个学生条目,包括结果中的学生TimetableEntries。这本身就没问题。我这样做,我认为这是正确的....

 using (MyDbContext ctx = new MyDbContext())
    {
        Student stud = ctx.Students
            .Include(
                        sa => sa.TimetableEntries.Select(te => te.ClassSubject)
                    ).FirstOrDefault();
    }

但我还想加载与每个TimetableEntry关联的ClassTeacher属性(除了ClassSubject属性)。似乎没有办法Select多个财产。我试图Select匿名类型......

        using (MyDbContext ctx = new MyDbContext())
        {
            Student stud = ctx.Students
                .Include(
                            sa => sa.TimetableEntries.Select(
                                te => new
                                {
                                    ClassSubject = te.ClassSubject,
                                    ClassTeacher = te.ClassTeacher
                                })
                        ).FirstOrDefault();
        }

但是这导致了以下错误:

  

Include路径表达式必须引用导航属性   在类型

上定义

有人可以解释我做错了什么以及如何克服这个问题?

非常感谢

Ť

2 个答案:

答案 0 :(得分:1)

您也可以指定一个字符串,如this article中的解释。

在你的情况下,它会像:

Student stud = ctx.Students.Include("TimetableEntries.ClassSubject") 

答案 1 :(得分:1)

要添加到Ouarzy的答案中,要同时获得ClassSubjectClassTeacher,您可以添加另一个Inlcude:

Student stud = ctx.Students.Include("TimetableEntries.ClassSubject").Include("TimetableEntries.ClassTeacher")