Umwandlung von Lambda-Ausdruck in einen Ausdrucksbaum

8

Aus C # in der Tiefe:

  

Nicht alle Lambda-Ausdrücke können in Ausdrucksbäume umgewandelt werden. Sie   kann ein Lambda nicht mit einem Anweisungsblock konvertieren (auch nur einen   return statement) in einen Ausdrucksbaum - & gt; es muss in der Form sein   das bewertet nur einen einzelnen Ausdruck.

Da Linq-to-Object-Anweisungen nicht in Ausdrucksbaumobjekte konvertiert werden, können die mit Linq-to-Object-Operatoren verwendeten Lambda-Ausdrücke einen Anweisungsblock enthalten

%Vor%

AUSGABE:

%Vor%

Ich habe noch nicht angefangen, Linq-To-Sql oder Linq-To-Entities zu lernen, aber ich nehme an, dass Lambda-Ausdrücke mit LINQ-Anweisungen, die auf IQueryable<T> arbeiten, nur einen einzigen Ausdruck enthalten können, nur weil restristion Ein einzelner Ausdruck kann in einen Ausdrucksbaum umgewandelt werden?

Danke

    
AspOnMyNet 07.12.2011, 18:10
quelle

2 Antworten

14

Es ist nicht nur so, dass sie nur einen einzelnen Ausdruck enthalten können - es kann überhaupt keine Anweisung Lambda sein. Sogar ein Block wie dieser:

%Vor%

wäre für LINQ to SQL ungültig. Es müsste wie folgt ausgedrückt werden:

%Vor%

(Ich habe gerade bemerkt, dass das das Teil des Buches ist, das du zitiert hast. Nun gut - es zeigt, dass ich konsequent bin:)

Beachten Sie, dass Ausdrucksbäume selbst tun ab .NET 4 die Möglichkeit haben, Blöcke zu enthalten, aber der C # -Compiler kann Anweisungslambdas nicht in diese Art von Ausdrucksbaum übersetzen. Es gibt auch andere Einschränkungen, aber sie verursachen selten Probleme.

Dies ist in Abschnitt 4.6 der C # 4 Spezifikation spezifiziert:

  

Nicht alle anonymen Funktionen können als Ausdrucksbäume dargestellt werden. Beispielsweise können anonyme Funktionen mit Anweisungskörpern und anonyme Funktionen, die Zuweisungsausdrücke enthalten, nicht dargestellt werden. In diesen Fällen ist eine Konvertierung zwar noch vorhanden, wird aber bei der Kompilierung fehlschlagen.

    
Jon Skeet 07.12.2011, 18:17
quelle
1

Sie haben Recht, sie können immer nur einen einzigen Ausdruck enthalten.

    
Patrick Karcher 07.12.2011 18:17
quelle

Tags und Links