VB.Net Linq to Entities-Null-Vergleich - 'Nichts' oder '= Nothing'?
Wir haben mehrere Projekte in VB.Net mit .Net Framework 4 und Linq to Entities für viele unserer SQL-Abfragen. Umzug in EF ist eine neue Verschiebung für uns (benutze es seit ca 4-6 Monaten) und hat die Rückendeckung des oberen Managements, weil wir können code so viel schneller. Verwenden wir noch eine Menge von gespeicherten Prozeduren, aber wir selbst führen diese durch Linq to Entities als gut.
Ich hoffe, klar einige Verwirrung, und ich kann nicht finden, eine direkte Antwort, die Sinn macht. Wir haben einige Anfragen, wo wir möchten, dass Datensätze, in denen ein bestimmtes Feld einen NULL-Wert. Dies sind einfache select-Abfragen, keine Aggregate oder left-joins, etc. Microsoft empfiehlt, die Abfrage in etwa so Aussehen MSDN-Link:
dim query = from a in MyContext.MyTables
Where a.MyField = Nothing
Select a
Ich habe mehrere Projekte, wo ich genau das tun, und es funktioniert Super, keine Warnungen in der IDE. Vor kurzem wurde ein neues Projekt erstellt wurde, wird von einem anderen Entwickler, und wenn er seine null-check wie oben, erhalten wir diese Warnung in der IDE:
Warnung 1 Dieser Ausdruck wird immer ausgewertet, um Nichts (wegen null propagation von der ist-gleich-operator). Um zu überprüfen, ob der Wert null ist, erwägen Sie die Verwendung 'Nichts'.
Vergleich der Projekte, option explicit und option strict sind auf für jeden. Wenn wir die Warnung ignorieren, bekommen wir die genaue Datensatz suchen wir für, wenn die app ausgeführt wird. Die Warnung geht Weg, wenn ich das = Zeichen IST. Aber warum kam diese Warnung erscheint in einem Projekt und die anderen nicht? Es ist verwirrend, wenn auch auf MSDN gibt es Beispiele, die über das ist-gleich-operator.
Equals
Schlüsselwort. Ich habe nicht einen Weg, um es zu testen, aber vielleicht versuchen Sie das stattdessen? Where a.MyField Equals Nothing
Es ist eine kontextbezogene Schlüsselwort ist nur in
Join
Klauseln (AFAIK). Ich glaube nicht, dass Sie können es verwenden, überall.
InformationsquelleAutor | 2012-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, was Sie hier sehen, ist, dass
MyField
ist einNullable(Of T)
geben. Wahrscheinlich eine primitiveInteger
,Single
usw ...Der Grund, warum Sie sehen diese Warnung ist, weil der compiler fördert die normale Gleichheitsoperator für die primitive Art der
Nullable(Of T)
version. Es führt im wesentlichen die folgendenDas Problem ist aber, dass, wenn
Integer?
hat den WertNothing
es nicht vergleichen, gleich nichts. Daher die obenWhere
- Klausel wird immer wiederFalse
. Der compiler versucht, Sie zu warnen, über diese problematische EckeNullable(Of T)
und drücken Sie, um eineIs Nothing
überprüfen, die bestimmen werden, wenna.MyField
hat eine nicht-null-Wert.Dieser blog-Artikel hat eine sehr detaillierte Erklärung, warum diese Warnung wird generiert, und alle von der mechanik dahinter. Der Artikel ist geschrieben für C#, aber die grundlegende Prämisse ist anwendbar auf VB.Net wie gut.
richtig. Normalerweise können Sie
=
mit einem nullable-Wert. Der Vergleich mitNothing
obwohl immer wiederFalse
wenn also der compiler gibt eine Warnung über esSpielen Sie mit diesem ein wenig mehr, was ich tun kann = Nichts-zu-string-Felder, die null-Werte zulassen in der Datenbank, aber nicht die anderen Daten-Typen und können entweder Nichts oder die HasValue-Mitglied, das Afshin erwähnt. Vielen Dank für shedding etwas Licht auf diese.
InformationsquelleAutor JaredPar
Generierten Spalte sollte eine
Nullable(Of T)
So können Sie überprüfen, ob das Feld einen Wert hat oder nicht, wie dieses:
InformationsquelleAutor Afshin Gh
Zumindest in LINQ to objects können Sie diese stattdessen zu verwenden:
Diese funktioniert einwandfrei mit beide, eine oder keine der zwei Werte wird Nichts.
InformationsquelleAutor Ronny Heuschkel