LINQ:序列中不包含任何元素错误

6
我正在尝试使用LINQ解决一个错误。 我正在使用LINQ获取XML节点值。我面临的问题是当XML中不存在该节点时,我会得到“Sequence contains no elements”错误。 我尝试使用DefaultIfEmpty、SingleOrDefault和FirstOrDefault。 但之后它会抛出nullpointer异常。我猜想我没有正确使用这些方法。 如何使用其中一个来解决这个问题?
这是我正在使用的LINQ代码。
var costnode6 = doc.Root.Descendants(ns + "SERVICEUPGRADES").Single(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM").Element(ns + "TOTAL_COST");
        var cost6 = (decimal)costnode6;
2个回答

7
OrDefault 方法在没有结果时会返回类型的默认值,如果您的情况下是null。这意味着在该调用之后执行 .Element(ns + "TOTAL_COST") 时,如果使用 Single,则会出现Sequence contains no elements 错误,如果使用SingleOrDefault,则会出现Null Reference Exception

您应该将该调用拿出来,检查结果是否为null:

var deliveryTime = doc.Root.Descendants(ns + "SERVICEUPGRADES")
    .SingleOrDefault(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM");
if(deliveryTime != null)
{     
    var costnode6 = deliveryTime.Element(ns + "TOTAL_COST");
    var cost6 = (decimal)costnode6;   
}

3

使用SingleOrDefault,但在尝试使用costnode6之前,请添加一个防护条款,如下所示:

var costnode6 = doc.Root.Descendants(ns + "SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element(ns + "DELIVERYTIME") == "before 3:30 PM").Element(ns + "TOTAL_COST");

if(costnode6 != null)
{
    var cost6 = (decimal)costnode6;
}

这将保护您的LINQ查询,以防止出现问题,因为OrDefault会使查询结果为null,如果没有找到正好一个结果; 而if条件将保护您免受尝试使用null对象的伤害。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接