将 XDocument.Descendants 与合并运算符一起使用 ??和可空类型

Using XDocument.Descendants with a coalesce operator ?? and nullable types

编译器:Visual Studio 2019
框架:.Net 2.1

给定这样一个 XML 文件:

<root>
  <data>
        <AdditionalOrderInfo>
            <AdditionalInfoItem key="{4567B566-A0A2-4214-B7E7-814FE179CDFC}" value="ScanItDental"/>
            <AdditionalInfoItem key="GlobalOrderID" value="EDC531BE6A0D4DC5BFEA0C6081D9F26B"/>
            <AdditionalInfoItem key="CreatedIn" value="2.20.1.2"/>
        </AdditionalOrderInfo>  
    </data>
</root>

我只需要为某些 key 值获取 AdditionalInfoItem

为了避免 null 错误,我尝试使用可空类型和合并运算符 ??

var additionalOrderInfo = document.Descendants(ns + "AdditionalOrderInfo").First();
var value = additionalOrderInfo.Descendants(ns + "AdditionalInfoItem")?.Where(el => el.Attribute("key").Value == "SomeKey")?.First()?.Attribute("value")?.Value ?? "";

但如果 key 不存在 returns:

Sequence contains no elements.

我以这种方式结束了使用 foreach 循环:

var additionalOrderInfo = document.Descendants(ns + "AdditionalOrderInfo").First();
foreach (var item in additionalOrderInfo.Descendants(ns + "AdditionalInfoItem"))
{
    switch (item.Attribute("key").Value)
    {
        case "SomeKey1":
            Order.SomeKey1 = item.Attribute("value").Value;
            break;
        case "SomeKey2":
            Order.SomeKey2 = item.Attribute("value").Value;
            break;
    }
}

有没有办法避免 foreach 循环并使用一行代码读取值?

仅在 Where 选择器之后尝试使用 FirstOrDefault 而不是 First

var value = additionalOrderInfo.Descendants(ns + "AdditionalInfoItem")?
                               .Where(el => el.Attribute("key").Value == "SomeKey")?
                               .FirstOrDefault()? // <--- Here
                               .Attribute("value")?.Value ?? "";

如果 Where(el => el?.Attribute("key")?.Value == "SomeKey") return 0 个元素,你得到 Sequence contains no elements 异常,所以你不能得到它的 First 元素。 FirstOrDefault returns null 而不是,所以下一个 nullcheck ? 继续。