首页 > 解决方案 > LINQ - 如何根据仅存在于某些记录中的另一个元素选择一个元素

问题描述

我有一些代码如下:

XmlDocument xmlGroupInfo = new XmlDocument();
xmlGroupInfo.InnerXml = "<Groups><Group><Name>Test1</Name><Query>Hello</Query></Group><Group><Name>Test0</Name><Query>1 = 0</Query></Group></Groups>";
XElement filterDoc = XElement.Parse(xmlGroupInfo.InnerXml);
var groupsWithFilters2 = filterDoc
    .Descendants("Group")
    .Where(d => d.Element("Query").Value != null)
    .Select(n => new { a = n.Element("Name").Value, b = n.Element("Query").Value });

如果我运行这个查询,一切正常——我得到一个包含组名和查询的结果,因为查询元素在两个实例中都存在。但是,我的数据的真实情况是这个 Query 元素只在某些时候出现。

如果我从 XML 的第一部分中删除 Query 元素,我会得到一个空异常。XML 现在看起来像这样:

xmlGroupInfo.InnerXml = "<Groups><Group><Name>Test1</Name></Group><Group><Name>Test0</Name><Query>1 = 0</Query></Group></Groups>";

那么,我该如何实现我的目标,即选择 Name 元素,但前提是存在具有一些非空值的 Query 元素?

标签: c#xmllinqlinq-to-xml

解决方案


您只需要处理子句Query中可选的元素。Where最简单的方法是使用null 条件运算符

.Where(d => d.Element("Query")?.Value != null)
//                            ^ this

推荐阅读