Vergleichen Sie nullbare Typen in Linq mit Sql
Habe ich eine Category-Entität, die hat eine null-ParentId-Feld. Wenn die Methode ausgeführt wird, und die Kategorie-id ist null, das Ergebnis scheint null, jedoch gibt es Kategorien, die null-ParentId mit dem Wert.
Was ist das problem hier, was bin ich?
public IEnumerable<ICategory> GetSubCategories(long? categoryId)
{
var subCategories = this.Repository.Categories.Where(c => c.ParentId == categoryId)
.ToList().Cast<ICategory>();
return subCategories;
}
Übrigens, wenn ich die Bedingung auf (c.ParentId == null), das Ergebnis scheint normal.
InformationsquelleAutor der Frage Ali Ersöz | 2009-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das erste, was zu tun ist, setzen Sie die Protokollierung, um zu sehen, was TSQL erzeugt wurde; zum Beispiel:
LINQ-to-SQL scheint zur Behandlung von null-Werten ein wenig uneinheitlich (je nach literal vs-Wert):
Also alles, was ich vorschlagen kann, ist die Verwendung der top-form mit null-Werten!
d.h.
Update - ich habe es funktioniert "richtig" mithilfe einer benutzerdefinierten
Expression
:InformationsquelleAutor der Antwort Marc Gravell
Anderen Weg:
oder
InformationsquelleAutor der Antwort ariel
Müssen Sie die Verwendung von operator Gleich:
Gleich fot nullable-Typen gibt wahr wenn:
und gibt false wenn:
Mehr info hier Nullable<.T>.Equals-Methode
InformationsquelleAutor der Antwort algreat
Meine Vermutung ist, dass es sich dabei um ein eher häufiges Attribut des DBMS ist - Nur weil zwei Dinge sind, beide null bedeutet nicht, dass Sie gleich sind.
Erarbeiten ein wenig, versuchen Sie die Ausführung dieser zwei Abfragen:
Den Grund für die "NULL" - Konstrukt ist, dass die in der DBMS-Welt, NULL != NULL, da die Bedeutung der NULL ist, der Wert ist undefiniert. Da NULL ist nicht definiert, Sie kann nicht sagen, dass zwei null-Werte sind gleich, da per definition wissen Sie nicht, was Sie sind.
Wenn Sie explizit das Häkchen für "Feld == NULL", LINQ wahrscheinlich konvertiert, die auf "Feld" IST NULL". Aber wenn Sie eine variable verwenden, ich vermute, dass LINQ nicht automatisch, dass die Konvertierung.
Hier ein MSDN-forum posten mit mehr info über dieses Problem.
Sieht aus wie ein guter "cheat" ist die änderung der lambda-Ausdruck wie folgt Aussehen:
InformationsquelleAutor der Antwort Eric Petroelje
Was etwas einfacheres wie dieses?
InformationsquelleAutor der Antwort Ryan Versaw
Oder können Sie einfach diesen verwenden. Es wird auch zu übersetzen, um ein schöneres sql-Abfrage
InformationsquelleAutor der Antwort Jiří Herník
Linq to Entities unterstützt Null-Coelescing (??) so einfach konvertieren Sie die null-auf-the-fly zu einem default-Wert.
InformationsquelleAutor der Antwort Kevbo