Reputation: 11653
I have a Question class that has public List property that can contain several Answers.
I have a question repository which is responsible for reading the questions and its answers from an xml file.
So I have a collection of Questions (List) with each Question object having a collection of Answers and I'd like to query this collection of Questions for an Answer (ie by its Name) by using Linq. I don't know how to do this properly.
I could do it with a foreach but I'd like to know whether there is a pure Linq way since I'm learning it.
Upvotes: 55
Views: 59578
Reputation: 59705
To find an answer.
questions.SelectMany(q => q.Answers).Where(a => a.Name == "SomeName")
To find the question of an answer.
questions.Where(q => q.Answers.Any(a => a.Name == "SomeName"))
In fact you will get collections of answers or questions and you will have to use First()
, FirstOrDefault()
, Single()
, or SingleOrDefault()
depending on your needs to get one specific answer or question.
Upvotes: 96
Reputation: 48255
It seems you could use something like this:
var query = from q in questions
from a in q.Answers
where a.Name == "Answer Name"
select a;
Upvotes: 7
Reputation: 16512
Use the SelectMany and First/FirstOrDefault (if you are needing one value)
List<Questions> questions = //initialization;
var someAnswer = questions.SelectMany(q=>q.Answers)
.First(a=>a.Name =="MyName");
Upvotes: 7
Reputation: 17162
from question in Questions
from answer in question.Answers
where answer.Name == something
select question // or select answer
Upvotes: 42