2013-08-08 23 views
5

LINQを使用してエラーを解決しようとしています。 LINQを使用してXMLノード値を取得しています。私が直面している問題は、XMLにノードが存在しないときです。Sequence contains no elementsエラーが発生しています。 私はDefaultIfEmpty、Singleordefault、Firstordefaultを使ってみました。 しかし、それはnullpointer例外をスローします。私は正しくメソッドの上にないと思います。 これらのいずれかを使用してポポルを解決するにはどうすればよいですか?LINQ:シーケンスに要素エラーがありません

私が使用している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; 

答えて

6

OrDefaultのメソッドは、結果がない場合は型のデフォルト値を返します。その場合、nullとなります。つまり、その呼び出しの後に.Element(ns + "TOTAL_COST")を実行すると、Singleを使用する場合はSequence contains no elementsエラー、SingleOrDefaultを使用する場合はNull Reference Exceptionが返されます。あなたは何をすべき

は、コールを引き出し、ヌルに対する結果をチェックです:

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

worked..thanksこと! – user2574121

3

使用SingleOrDefaultが、その後このように、costnode6を使用しようとする前に、ガード句を持っている:OrDefaultは、クエリの結果を行いますので、

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クエリを保護しますnull正確に1つの結果が見つからない場合。 ifの条件では、nullオブジェクトの使用を防ぎます。

関連する問題