C # LINQ Wo Prädikat Typ Argumente

c# entity-framework expression-trees lambda

Frage

Ich habe ein XElement mit Werten für Scheindaten.

Ich habe einen Ausdruck, um das XML abzufragen:

Expression<Func<XElement, bool>> simpleXmlFunction = 
    b => int.Parse(b.Element("FooId").Value) == 12;

benutzt in:

Expression<Func<XElement, bool>> simpleXmlFunction = 
    b => int.Parse(b.Element("FooId").Value) == 12;

Der Entwurfszeitfehler ist:

Die Typargumente für die Methode 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben '

Der Delegat, der Wo übergeben wird, sollte ein XElement aufnehmen und ein Bool zurückgeben. Wenn das Element mit der Abfrage übereinstimmt, bin ich mir nicht sicher, ob ich dem Delegat noch etwas hinzufügen oder die where-Klausel, um den Typ zu markieren.

Auch die parallele Methode für die echte Funktion gegen das Entity Framework hat dieses Problem nicht. Was stimmt nicht mit der LINQ-to-XML-Version?

Akzeptierte Antwort

Machen Sie nicht simpleXmlFunction einen Ausdruck <Func <XElement, bool >>. Mach es zu einem Func <XElement, bool>. Das wird als Delegierter von .Where erwartet.

Func<XElement, bool> simpleXmlFunction =
     new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);

Beliebte Antwort

Ich denke, die vollständige Antwort enthält die vorherige Antwort, David Mortons Kommentar und ein aktuelles Code-Snippet:

Die Implementierung von .Where für IQueryable unterscheidet sich von der Implementierung von .Where für IEnumerable. IEnumerable.Wo erwartet ein:

Func<XElement, bool> predicate

Sie können die Funktion aus dem Ausdruck zusammenstellen, indem Sie Folgendes tun:

Func<XElement, bool> predicate

Dadurch können Sie den generierten Ausdrucksbaum betrachten und das kompilierte Formular zum Abfragen der XML-Sammlung verwenden.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum