Vergleichen Sie in von auf null festlegbaren Typen in Linq to 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.
Ich habe einen Weg gefunden,... wird aktualisiert...
InformationsquelleAutor 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
:Ich lief in genau dem gleichen problem, die gleiche Problemumgehung und wollte Fragen, ob es einen besseren Weg, es zu tun. Sieht aus wie es nicht ist 🙁 Dieses Verhalten ist wirklich counter-intuitive.
Ich würde sagen, die Inkonsistenz zwischen literalen und Variablen schlimmer ist, dass counter-intuitive. Vielen Dank für die Bestätigung meiner Vermutung. +1
Es sollten eigentlich behoben sein, ich habe gerade über diese erfahren und nun vermute ich, dass einige der code, den ich schrieb in früheren Projekten betroffen sein können naja, ein bisschen nervt...
Ich vermute, dass es ist, weil die beiden Typen sind inkonsistent-ich denke, dass ist eine Monade (ericlippert.com/2013/02/25/monads-part-two) und der andere ist ein 'null-literal' ericlippert.com/2013/07/25/what-is-the-type-of-the-null-literal ... aber ich gestehe das Beispiel macht mein Kopf drehen.
InformationsquelleAutor Marc Gravell
Anderen Weg:
oder
Dies funktioniert für mich perfekt. Deshalb sollten wir uns standardmäßig mit Equals(x, y) anstatt "==" in unserem Prädikat oder gibt es noch andere Fallstricke mit Equals?
InformationsquelleAutor 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
Getestet habe ich diese in LinqPad und dies scheint nicht zu funktionieren. Wenn Sie in die 'null' - literal, das generierte sql-tests Kategorien.ParentID IST NULL, wie man erwarten würde. Aber wenn Sie übergeben in eine variable, prüft es, Kategorien.ParentID = p0, das wird nicht funktionieren, wenn p0 ist null. Das Objekt.Equals(Kategorien.ParentID, value) Ansatz von @ariel arbeitete großartig.
InformationsquelleAutor 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:
NÖ! immer noch nichts! :/
Sie müssen mit dem Objekt.Equals(a, b) die für mich gearbeitet hat, wo ein.Equals(b) nicht
InformationsquelleAutor Eric Petroelje
Was etwas einfacheres wie dieses?
InformationsquelleAutor Ryan Versaw
Oder können Sie einfach diesen verwenden. Es wird auch zu übersetzen, um ein schöneres sql-Abfrage
InformationsquelleAutor Jiří Herník
Linq to Entities unterstützt Null-Coelescing (??) so einfach konvertieren Sie die null-auf-the-fly zu einem default-Wert.
InformationsquelleAutor Kevbo