Ausgabe
Ich möchte eine Abfrage wie folgt ausführen
var result = from entry in table
where entry.something == null
select entry;
und erhalten Sie eine IS NULL
generierte.
Bearbeitet: Nach den ersten beiden Antworten muss ich klarstellen, dass ich Entity Framework und nicht Linq to SQL verwende. Die Methode object.Equals() scheint in EF nicht zu funktionieren.
Bearbeiten Nr. 2: Die obige Abfrage funktioniert wie vorgesehen. Es generiert korrekt IS NULL
. Mein Produktionscode war jedoch
value = null;
var result = from entry in table
where entry.something == value
select entry;
und das generierte SQL war something = @p; @p = NULL
. Es scheint, dass EF den konstanten Ausdruck korrekt übersetzt, aber wenn eine Variable beteiligt ist, behandelt es sie wie einen normalen Vergleich. Macht eigentlich Sinn. Ich werde diese Frage schließen.
Lösung
Problemumgehung für Linq-to-SQL:
var result = from entry in table
where entry.something.Equals(value)
select entry;
Problemumgehung für Linq-to-Entities (autsch!):
var result = from entry in table
where (value == null ? entry.something == null : entry.something == value)
select entry;
Dies ist ein böser Fehler, der mich mehrmals gebissen hat. Wenn dieser Fehler auch Sie betrifft, besuchen Sie bitte den Fehlerbericht auf UserVoice und teilen Sie Microsoft mit, dass dieser Fehler auch Sie betrifft.
Bearbeiten: Dieser Fehler wird in EF 4.5 behoben ! Vielen Dank an alle, die diesen Fehler positiv bewertet haben!
Aus Gründen der Abwärtskompatibilität wird es Opt-in sein – Sie müssen eine Einstellung manuell aktivieren, damit sie entry == value
funktioniert. Noch kein Wort darüber, was diese Einstellung ist. Bleib dran!
Bearbeiten 2: Laut diesem Beitrag des EF-Teams wurde dieses Problem in EF6 behoben! Woohoo!
Wir haben das Standardverhalten von EF6 geändert, um die dreiwertige Logik zu kompensieren.
Dies bedeutet, dass vorhandener Code, der auf dem alten Verhalten ( null != null
, aber nur beim Vergleich mit einer Variablen) basiert, entweder so geändert werden muss, dass er sich nicht auf dieses Verhalten verlässt, oder UseCSharpNullComparisonBehavior
auf „false“ gesetzt werden muss, um das alte fehlerhafte Verhalten zu verwenden.
Beantwortet von – BlueRaja – Danny Pflughoeft
Antwort geprüft von – Willingham (FixError Volunteer)