[FIXED] Wie kann ich Nullwerte im Entity -Framework abfragen?

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 NULLgenerierte.

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 == valuefunktioniert. 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 UseCSharpNullComparisonBehaviorauf „false“ gesetzt werden muss, um das alte fehlerhafte Verhalten zu verwenden.


Beantwortet von –
BlueRaja – Danny Pflughoeft


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like