2016-04-04 6 views
-1

ich den nachfolgenden Code haben:Zuerst auf Enum werfen „Sequenz enthält keine Elemente“

if (myList.Where (.. condition ..).Where (.. another condition ..).Any()) 
{ 
    var element = myList.Where (.. condition ..).Where (.. another condition ..).First().Elements ; 

    ..some logic over element .. 
} 

ich die Ausnahme erhalten in der ersten Zeile in der IF-Anweisung „Sequenz keine Elemente enthält“.

myList ist ein List<MyObject>, in dem MyObject das Formular ExpandoObject erbt und einen Getter namens Elements hat, der mir das Objekt zurückgibt, das als dynamisch gecastet wurde.

Bearbeiten wie angefordert Ich versuche, mehr Details über die Abfrage in beiden und ersten ausgeführt werden.

myList.Where (x => x.Child.Name.Equal ("Name").Where (x => x.Elements.Value == myValue) 
+2

Bitte zeigen Sie eine [mcve] - abgesehen von allem anderen, wissen wir nicht, ob die Bedingungen zwischen den beiden Zeilen identisch sind, und ob die Datenquelle stabil ist. (Im Allgemeinen würde ich empfehlen, diese Art der Doppelbewertung zu vermeiden ...) –

+2

Nun, nach welcher Erklärung suchen Sie? Es gibt kein Element, das Ihren Filtern entspricht. Und warum machst du "Any" + "First" anstatt nur "FirstOrDefault" zu machen? – Luaan

+1

Eine Randnotiz. Warum schreibst du 'sequence.Where (condition) .Any()' anstelle von 'sequence.Any (condition)'? – Dennis

Antwort

2

Das Problem ist, dass nichts entspricht Ihre where Bedingung (en) vor dem Aufruf von First(). Vorausgesetzt, dass Sie nicht unbedingt den Code angezeigt wird, ist es schwierig zu sagen, ob die Bedingungen die gleichen sind, aber der beste Ansatz wäre es wie folgt neu zu schreiben:

var thing = myList.Where (.. condition ..).Where (.. another condition ..).FirstOrDefault(); 

if (thing != null) 
{ 
    var element = thing.Element; 
    ..some logic over element .. 
} 

Dies den Vorteil hat, nicht die where Duplizieren Bedingung (en) zweimal und speichert die doppelte Aufzählung der Eingabequelle, die abhängig davon, was myList tatsächlich ist, Leistungseinbußen erleiden könnte.

0

so etwas wie dieses Versuchen:

var myValue = myList.Where(..condition..).Where(..another condition..).FirstOrDefault(); 
if (myValue != null) 
{ 
    var element = myValue.Elements ; 
    ..some logic over element .. 
} 

Sie nutzen die Tatsache, dass, wenn es keine Ergebnisse, die Sie ein Null erhalten sind, und überprüfen Sie gegen die Null anstatt die Abfrage zweimal ausführen. Wenn Sie die Abfrage ändern müssen, haben Sie nur einen Platz, um sie zu ändern.

Ich stelle mir vor, dass Ihr Fehler durch die vorhergehenden Prädikate verursacht wurde in der .Any() und der .First()

0

Sie haben FirstOrDefault() verwenden etwas anders zu sein!

var element= myList.FirstOrDefault(x => condition1 && condition2 && ...); 

if(element!= null) 
{ 
    // Apply logic over the element 
} 
Verwandte Themen