Wie kann ich im Entity Framework nach Nullwerten abfragen?

.net ado.net entity-framework

Frage

Ich möchte eine Abfrage wie diese ausführen

   var result = from entry in table
                     where entry.something == null
                     select entry;

und erhalte eine IS NULL .

Bearbeitet: Nach den ersten beiden Antworten möchte ich klarstellen, dass ich Entity Framework verwende und nicht Linq to SQL. Die object.Equals () -Methode scheint in EF nicht zu funktionieren.

Edit Nr.2: Die obige Abfrage funktioniert wie beabsichtigt. Es generiert korrekt IS NULL . Mein Produktionscode war jedoch

value = null;
var result = from entry in table
                         where entry.something == value
                         select entry;

und die generierte SQL war something = @p; @p = NULL . Es scheint, dass EF den konstanten Ausdruck richtig übersetzt, aber wenn eine Variable involviert ist, behandelt sie ihn wie einen normalen Vergleich. Macht eigentlich Sinn. Ich schließe diese Frage

Akzeptierte Antwort

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 (aua!):

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 sich dieser Fehler auch auf Sie ausgewirkt hat, besuchen Sie bitte den Fehlerbericht zu UserVoice und teilen Sie Microsoft mit, dass dieser Fehler Sie ebenfalls beeinflusst hat.


Edit: Dieser Fehler wird in EF 4.5 behoben ! Vielen Dank an alle für diesen Bug!

Aus Gründen der Abwärtskompatibilität wird die Option aktiviert. Sie müssen eine Einstellung manuell aktivieren, damit der entry == value funktioniert. Noch kein Wort zu dieser Einstellung. Bleib dran!


Edit 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 UseCSharpNullComparisonBehavior ( null != null , aber nur beim Vergleich mit einer Variablen) , entweder so geändert werden muss, dass er sich nicht auf dieses Verhalten UseCSharpNullComparisonBehavior , oder UseCSharpNullComparisonBehavior auf false setzt, um das alte UseCSharpNullComparisonBehavior Verhalten zu verwenden.


Beliebte Antwort

Seit Entity Framework 5.0 können Sie folgenden Code verwenden, um Ihr Problem zu lösen:

public abstract class YourContext : DbContext
{
  public YourContext()
  {
    (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;
  }
}

Dies sollte Ihre Probleme lösen, da Entity Framerwork einen "C # -ähnlichen" Nullvergleich verwendet.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum