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
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.
Sie haben Recht, sie können immer nur einen einzigen Ausdruck enthalten.