我正在尝试使用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;
答案 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
对象。