linq问题:查询嵌套集合

kit*_*une 47 .net c# linq collections linq-to-xml

我有一个Question类,它有公共List属性,可以包含几个Answers.

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

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

我可以用foreach做这件事,但我想知道自从我学习它以来是否有纯粹的Linq方式.

Dan*_*ner 83

找到答案.

questions.SelectMany(q => q.Answers).Where(a => a.Name == "SomeName")
Run Code Online (Sandbox Code Playgroud)

找到答案的问题.

questions.Where(q => q.Answers.Any(a => a.Name == "SomeName"))
Run Code Online (Sandbox Code Playgroud)

事实上,你会得到答案或问题的集合,你将不得不使用First(),FirstOrDefault(),Single(),或SingleOrDefault()根据您的需要得到一个明确的答案或问题.

  • 我希望这些问题可以保留,所以更像是:... SelectMany(q => q.Answers.Select(a => new {A = a,Q = q}).其中(qa => qa.A.Name =="SomeName")会更合适. (2认同)

ybo*_*ybo 36

from question in Questions
from answer in question.Answers
where answer.Name == something
select question // or select answer
Run Code Online (Sandbox Code Playgroud)


Mik*_*e_G 7

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

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


bru*_*nde 7

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

var query = from q in questions
            from a in q.Answers
            where a.Name == "Answer Name"
            select a;
Run Code Online (Sandbox Code Playgroud)