2013-08-17 8 views
5

私は、次のクラスがあります。だから私は問題、質問を参照して情報を回答することができますLINQで複数のレベルをインクルードする方法はありますか?

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

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; } 
} 

私はこのようなクエリを発行したいが。しかし、私の最後のインクルードに問題があり、アンサーを取り込む方法を理解できません。

誰かが私にこれに関するいくつかのアドバイスを与えることができますか?

答えて

5

.Select()を使用できます。

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

ここで回答が記載されます。

+1

を取るだろう。 2番目の質問には質問も含まれます。 – user2674389

+0

@ user2674389更新されました! .. –

4

これはEntityFramework 7.0で変更されました。

新しい構文は、最初の `Include`が廃止され、フォーム

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

関連する問題