2009-04-06 4 views
40

Ich habe eine Frage Klasse, die öffentliche List-Eigenschaft, die mehrere enthalten kann Antworten.linq Frage: Abfrage verschachtelte Sammlungen

Ich habe ein Fragen-Repository, das für das Lesen der Fragen und ihrer Antworten aus einer XML-Datei zuständig ist.

Also habe ich eine Sammlung von Fragen (Liste) mit jedem Frageobjekt mit einer Sammlung von Antworten und ich möchte diese Sammlung von Fragen für eine Antwort (dh durch den Namen) mit Linq abfragen. Ich weiß nicht, wie ich das richtig machen soll.

Ich könnte es mit einer foreach tun, aber ich würde gerne wissen, ob es einen reinen Linq Weg gibt, seit ich es lerne.

+0

Suchen Sie nach einer Antwort auf eine verwandte gegebene Frage oder für eine spezifische Antwort, die mit irgendeiner Frage verbunden sein könnte? –

Antwort

69

Um eine Antwort zu finden.

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

Um die Frage einer Antwort zu finden.

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

In der Tat werden Sie Sammlungen von Antworten oder Fragen erhalten und die Sie verwenden müssen, um First(), FirstOrDefault(), Single() oder SingleOrDefault() je nach Ihren Bedürfnissen einer bestimmten Antwort oder Frage zu bekommen.

+2

Ich würde erwarten, dass die Fragen beibehalten werden, also etwas mehr wie: ... SelectMany (q => q.Answers.Select (a => neu {A = a, Q = q}). Wobei (qa = > qa.A.Name == "SomeName") wäre besser geeignet. – Richard

+0

Sie können immer mit der Antwort auf die Frage zurückkommen.Question - keine Notwendigkeit, einen anonymen Typ einzuführen. –

+0

@danbruc: Keine solche Eigenschaft in der Liste aufgeführt Q – Richard

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

Das ist, was ich gesucht habe. –

7

Verwenden Sie die Select und Erste/FirstOrDefault (wenn Sie einen Wert benötigen, sind)

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

Es scheint, dass Sie so etwas wie dies nutzen könnten:

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