2013-08-17 2 views
5

У меня есть следующие классы:Как я могу включить в LINQ более одного уровня?

public class Problem : AuditableTable 
{ 
    public Problem() 
    { 
     this.Questions = new List<Question>(); 
    } 
    public int ProblemId { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<Question> Questions { get; set; } 
} 

public Question() 
    { 
     this.Answers = new List<Answer>(); 
    } 
    public int QuestionId { get; set; } 
    public int ProblemId { get; set; } 
    public virtual ICollection<Answer> Answers { get; set; } 
    public virtual Problem Problem { get; set; } 
} 
public class Answer : AuditableTable 
{ 
    public int AnswerId { get; set; } 
    public int QuestionId { get; set; } 
    public string Text { get; set; } 
    public virtual Question Question { get; set; } 
} 

Я хочу выдать запрос, как это:

 var problems = _problemsRepository.GetAll() 
      .Where(p => p.ProblemId == problemId) 
      .Include(p => p.Questions) 
      .Include(p => p.Questions.Answers) 
      .ToList(); 
     return problems; 

Так что я могу увидеть проблемы, вопрос и ответ на информацию. Но есть проблема с моим последним включением, и я не могу решить, как включить ответы.

Может кто-нибудь дать мне несколько советов по этому вопросу.

ответ

5

Вы можете использовать .Select().

var problems = _problemsRepository.GetAll() 
      .Where(p => p.ProblemId == problemId) 
      .Include(p => p.Questions.Select(q => q.Answers)) 
      .ToList(); 

Теперь ваши ответы будут включены.

+1

Первый 'Include' является устаревшим. Второй вопрос также будет включать вопросы. – user2674389

+0

@ user2674389 Обновлено! Спасибо за комментарий, что .. –

4

Это изменение в EntityFramework 7.0.

Новый синтаксис будет иметь форму

var problems = _problemsRepository.GetAll() 
      .Where(p => p.ProblemId == problemId) 
      .Include(p => p.Questions) 
      .ThenInclude(q => q.Answers) 
      .ToList(); 
+0

Ah finnaly решение для EF 7. На протяжении веков это искали, просто заметив, что EF 7 не поддерживает ленивую загрузку, а предыдущие решения не работают -_- – stibay