ein Ausdrucksbaum lambda darf keinen Null-propagierenden Operator enthalten

12

Frage : Die Zeile price = co?.price ?? 0, im folgenden Code gibt mir den obigen Fehler. aber wenn ich ? von co.? entferne, funktioniert es gut. Ich habe versucht, diesem MSDN-Beispiel zu folgen, wo sie es verwenden ? on line select new { person.FirstName, PetName = subpet?.Name ?? String.Empty }; Es scheint also, ich muss verstehen, wann ? mit ?? verwendet werden soll und wann nicht.

Fehler :

  

Ein Ausdrucksbaum lambda darf keinen Null-propagierenden Operator enthalten

%Vor%     
nam 21.06.2017, 16:16
quelle

2 Antworten

26

Das Beispiel, in dem Sie zitiert haben, verwendet LINQ to Objects, wobei die impliziten Lambda-Ausdrücke in der Abfrage in Delegaten konvertiert werden, während Sie EF oder ähnliches mit IQueryable<T> -Fragen verwenden , wobei die Lambda-Ausdrücke in Ausdrucksbäume konvertiert werden. Ausdrucksbäume unterstützen nicht den bedingten Nulloperator (oder Tupel).

Mach es einfach auf die alte Art:

%Vor%

(Ich glaube, der Null-Koaleszenz-Operator ist in einem Ausdrucksbaum in Ordnung.)

    
Jon Skeet 21.06.2017, 16:19
quelle
3

Der Code, zu dem Sie eine Verknüpfung herstellen, verwendet List<T> . List<T> implementiert IEnumerable<T> , aber nicht IQueryable<T> . In diesem Fall wird die Projektion im Speicher ausgeführt und ?. funktioniert.

Sie verwenden IQueryable<T> , was sehr unterschiedlich funktioniert. Für IQueryable<T> wird eine Repräsentation der Projektion erstellt, und Ihr LINQ-Anbieter entscheidet zur Laufzeit, was damit geschehen soll. Aus Gründen der Abwärtskompatibilität kann ?. hier nicht verwendet werden.

Abhängig von Ihrem LINQ-Provider können Sie möglicherweise die Ebene . verwenden und trotzdem keine NullReferenceException erhalten.

    
hvd 21.06.2017 16:24
quelle