如何在LINQ查询中包含多个级别?

时间:2014-03-25 04:55:47

标签: c# linq linq-to-entities navigation-properties

我有三个由表示的SQL表,我希望Entity Framework 6加入这些表,以便我获得ExamTestUserTest的所有详细信息UserTest.UserID0X的表格。

我已经设置了一个存储库,这适用于简单的查询但是我无法加入问题底部的LINQ中的UserTest类。

这是我的课程:

public class Exam
{
    public int ExamId { get; set; }
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Test> Tests { get; set; }
}

public class Test
{
    public int TestId { get; set; }
    public int ExamId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<UserTest> UserTests { get; set; }
}

public class UserTest
{
    public int UserTestId { get; set; }
    public string UserId { get; set; }
    public int TestId { get; set; }
    public int QuestionsCount { get; set; }
}

我想要做的是查询看起来像这样:

var exams = _examsRepository
           .GetAll()
           .Where(q => q.SubjectId == subjectId)
           .Include(q => q.Tests )
           .Include(q => q.Tests.UserTests) // Error on this line
           .ToList();

但这并不是让我在VS2013中加入UserTests

更新

这是我第一次尝试的查询:

  var userTests = _userTestsRepository
        .GetAll()
        .Include(t => t.Test)
        .Include(t => t.Test.Exam)
        .Where(t => t.UserId == "0" || t.UserId == userId);

这个似乎工作但是当我看到输出时,我看到了这样的东西:

[{"userTestId":2,
  "userId":"0",
  "testId":12,
  "test":{
      "testId":12,"examId":1,
      "exam":{
          "examId":1,"subjectId":1,
          "tests":[
               {"testId":13,"examId":1,"title":"Sample Test1",
                "userTests":[
                      {"userTestId":3,
                       "userId":"0",

请注意,这开始重复并带回比我预期更多的数据

1 个答案:

答案 0 :(得分:0)

那是因为Tests是一个集合,而不仅仅是一个对象,所以它没有UserTests属性。您使用lambda来指定多个子节点的孙子节点而不是单个子节点:

var exams = _examsRepository
           .GetAll()
           .Where(q => q.SubjectId == subjectId)
           .Include(q => q.Tests.Select(t => t.UserTests))
           .ToList();

请注意,不需要两个Include调用,因为如果您包含孙子女,则会隐式包含子项。