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

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

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

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

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

【问题讨论】:

  • 您是在寻找与给定问题相关的答案,还是在寻找可能与任何问题相关的特定答案?

标签: c# .net linq collections linq-to-xml


【解决方案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>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多