LINQ问题:查询嵌套集合

53

我有一个Question类,其中有一个公共的List属性,可以包含多个Answers

我有一个问题存储库负责从xml文件中读取问题及其答案。

因此,我有一个Questions(List)集合,每个Question对象都有一个Answers的集合,我想通过使用Linq查询这个Questions集合中的Answer(例如按名称)。我不知道如何正确地实现这一点。

我可以使用foreach来完成,但我想知道是否有一种纯Linq的方法,因为我正在学习它。


您是在寻找与特定问题相关的答案,还是寻找任何问题都可能相关的特定答案? - Garry Shutler
4个回答

95

寻找答案。

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

找到一个回答对应的问题。

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

实际上,您将获得答案或问题的集合,并且根据您的需求使用First()FirstOrDefault()Single()SingleOrDefault()来获取一个特定的答案或问题。


2
我认为问题应该被保留,所以更适合的写法是:... SelectMany(q => q.Answers.Select(a => new { A = a, Q = q }).Where(qa => qa.A.Name == "SomeName")。 - Richard
你可以随时回到带有答案的问题。问题 - 无需介绍匿名类型。 - Daniel Brückner
@danbruc:在 Q 中没有列出此类属性。 - Richard
你说得对!我想错了,问题只提到了一个类,没有涉及ORM。 - Daniel Brückner

41
from question in Questions
from answer in question.Answers
where answer.Name == something
select question // or select answer

这就是我一直在寻找的。 - Afzaal Ahmad Zeeshan

7

使用SelectMany和First/FirstOrDefault(如果您只需要一个值)

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

7
看起来您可以使用这样的东西:
var query = from q in questions
            from a in q.Answers
            where a.Name == "Answer Name"
            select a;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接