2009-04-06 12 views
40

Ho una classe di domande relative alla proprietà Elenco pubblica che può contenere più risposte.domanda linq: interrogazione di raccolte nidificate

Ho un repository di domande che è responsabile della lettura delle domande e delle sue risposte da un file xml.

Quindi ho una raccolta di domande (Elenco) con ogni oggetto Domanda con una raccolta di risposte e vorrei interrogare questa raccolta di domande per una risposta (ad esempio con il suo nome) utilizzando Linq. Non so come farlo correttamente.

Potrei farlo con un foreach ma mi piacerebbe sapere se c'è un modo Linq puro poiché sto imparando.

+0

Siete alla ricerca di una risposta relativa a un domanda data o per una risposta specifica che potrebbe essere correlata a qualsiasi domanda? –

risposta

69

Per trovare una risposta.

questions.SelectMany(q => q.Answers).Where(a => a.Name == "SomeName") 

Per trovare la domanda di una risposta.

questions.Where(q => q.Answers.Any(a => a.Name == "SomeName")) 

In realtà si otterrà collezioni di risposte o domande e si dovrà utilizzare First(), FirstOrDefault(), Single() o SingleOrDefault() a seconda delle esigenze per ottenere una risposta o una domanda specifica.

+2

Mi aspetto che le domande vadano mantenute, quindi qualcosa di più simile a ... SelectMany (q => q.Answers.Select (a => new {A = a, Q = q}). Dove (qa = > qa.A.Name == "SomeName") sarebbe una soluzione migliore – Richard

+0

Puoi sempre tornare alla domanda con answer.Question - non c'è bisogno di introdurre un tipo anonimo –

+0

@danbruc: Nessuna proprietà del genere elencata nel Q – Richard

32
from question in Questions 
from answer in question.Answers 
where answer.Name == something 
select question // or select answer 
+0

Questo è quello che stavo cercando. –

7

Utilizzare i SelectMany e First/FirstOrDefault (se si ha bisogno di un valore)

List<Questions> questions = //initialization; 
var someAnswer = questions.SelectMany(q=>q.Answers) 
          .First(a=>a.Name =="MyName"); 
7

Sembra si potrebbe usare qualcosa di simile:

var query = from q in questions 
      from a in q.Answers 
      where a.Name == "Answer Name" 
      select a; 
Problemi correlati