linq 问题:查询嵌套集合

Posted

技术标签:

【中文标题】linq 问题:查询嵌套集合【英文标题】:linq question: querying nested collections 【发布时间】:2010-10-17 19:25:22 【问题描述】:

我有一个 Question 类,它具有可以包含多个 Answers 的公共 List 属性。

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

所以我有一个问题集合(列表),每个问题对象都有一个答案集合,我想使用 Linq 查询这个问题集合以获取答案(即按其名称)。我不知道如何正确地做到这一点。

我可以用 foreach 来做,但我想知道是否有纯 Linq 方式,因为我正在学习它。

【问题讨论】:

您是在寻找与给定问题相关的答案,还是在寻找可能与任何问题相关的特定答案? 【参考方案1】:

寻找答案。

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

寻找答案的问题。

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

事实上,您将获得答案或问题的集合,您必须使用First()FirstOrDefault()Single()SingleOrDefault(),具体取决于您获得特定答案或问题的需要。

【讨论】:

我希望问题会被保留,所以更像是: ... SelectMany(q => q.Answers.Select(a => new A = a, Q = q ).Where(qa => qa.A.Name == "SomeName") 会更合适。 您可以随时使用 answer.Question 回到问题 - 无需引入匿名类型。 @danbruc:Q 中没有列出这样的属性 你是对的!我想到了一些 ORM,但问题只提到了一个类。【参考方案2】:

看来你可以使用这样的东西:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:
from question in Questions
from answer in question.Answers
where answer.Name == something
select question // or select answer

【讨论】:

这就是我要找的。​​span>

以上是关于linq 问题:查询嵌套集合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Linq 在 Mongo C# 2.2 驱动程序中查询嵌套列表?

为啥我不能对 Visio Masters 集合使用 Linq 查询?

在 LINQ 中使用 PropertyInfo 对象查询集合

Linq查询datatable的记录集合

linq依据传入数据集合查询相应子级数据

LINQ学习系列-----3.1 查询非泛型集合