2013-08-08 15 views
5

Próbuję rozwiązać błąd przy użyciu LINQ. Ciągnę wartość węzła XML za pomocą LINQ. Problem, z którym się borykam, to sytuacja, w której węzeł nie jest obecny w pliku XML. Otrzymuję błąd o wartości Sequence contains no elements. Próbowałem użyć DefaultIfEmpty, Singleordefault i Firstordefault. Ale wtedy rzuca wyjątek nullpointer. Sądzę, że nie jestem w stanie poprawnie stosować metody. Jak można użyć jednego z nich do rozwiązania problemu poblem?LINQ: Sekwencja nie zawiera błędów elementów

Oto kod LINQ, którego używam.

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; 

Odpowiedz

6

Metody OrDefault zwracają domyślną wartość dla typu, jeśli nie ma wyniku, który w twoim przypadku byłby null. Oznacza to, że po wykonaniu połączenia .Element(ns + "TOTAL_COST") otrzymasz błąd Sequence contains no elements, jeśli używasz Single lub Null Reference Exception, jeśli używasz SingleOrDefault.

Co należy zrobić, to wyciągnąć zawołać i sprawdzić wynik na wartości 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; 
} 
+0

To worked..thanks !! – user2574121

3

Zastosowanie SingleOrDefault, ale mają klauzulę ochronną przed próbuje użyć costnode6 coś takiego:

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

To będzie chronić zapytanie LINQ od wysadzania, ponieważ OrDefault sprawi, że wynik zapytania null jeśli nie znaleziono dokładnie jednego wyniku; a warunek if chroni przed próbami użycia obiektu null.

Powiązane problemy