LINQ:Sequence不包含任何元素错误

时间:2013-08-08 00:18:28

标签: c# xml linq

我正在尝试使用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 个答案:

答案 0 :(得分:7)

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

你应该做的是拉出呼叫并检查结果为空:

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;   
}

答案 1 :(得分: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对象。