2013-08-17 20 views
5

Ho le seguenti classi:Come posso .Includere più di un livello in 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; } 
} 

voglio emettere una query come questa:

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

così posso vedere problema, domanda e risposta informazioni. Ma c'è un problema con la mia ultima inclusione e non riesco a capire come ottenere le risposte incluse.

Qualcuno può darmi qualche consiglio su questo.

risposta

5

È possibile utilizzare .Seleziona().

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

Ora le vostre risposte saranno incluse.

+1

Il primo 'Include' è obsoleto. Il secondo includerà anche le domande. – user2674389

+0

@ user2674389 Aggiornato! Grazie per aver commentato che .. –

4

Questo è cambiato in EntityFramework 7.0.

La nuova sintassi assumerà la forma

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

Ah, finalmente una soluzione per EF 7. Cercavo questo per anni visto che EF 7 non supportava il caricamento pigro e le soluzioni precedenti non funzionano -_- – stibay

Problemi correlati