LINQ - 如何根据仅存在于某些记录中的另一个元素选择一个元素

Posted

技术标签:

【中文标题】LINQ - 如何根据仅存在于某些记录中的另一个元素选择一个元素【英文标题】:LINQ - How to select one element based on another element that exists in only some records 【发布时间】:2020-12-17 22:31:55 【问题描述】:

我有一些代码如下:

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 元素,但前提是存在具有某些非 null 值的 Query 元素?

【问题讨论】:

不要使用 Value 来代替: .Select(n => new a = (string)n.Element("Name"), b = (string)n.Element("Query" ) );这仅适用于接受空值(如字符串)的类。 感谢您的反馈。 【参考方案1】:

您只需要处理Query 元素在您的Where 子句中是可选的。最简单的方法是使用null conditional operator:

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

【讨论】:

非常感谢!

以上是关于LINQ - 如何根据仅存在于某些记录中的另一个元素选择一个元素的主要内容,如果未能解决你的问题,请参考以下文章

仅当值存在于 SQL 的另一列中时,如何选择列的值?

列出存在于另一个模型中的所有关联模型记录,该模型存在于 rails 中的另一个命名空间中

我的 MS Access 组合框仅适用于某些记录

如果所有记录都存在于 sql server 的另一个表中,则返回行列表

OrderBy IQueryable 列表基于 LINQ 中的另一个内部列表 [重复]

LINQ 如何在一对多连接中指定选择某些列