2017-02-23 2 views
1

ich, dass nur dann realisiert, wenn ich diese beantragenWarum Linq Substring() null Wert ignorieren

Orders.Where(y => y.Sub_Item_Id.Substring(0, 10) != y.Sub_Item_Site_Id.Substring(0, 10)) 

Die Abfrage alle meine Nullwert ignorieren, die in y.Sub_Item_Site_Id existieren können. Wenn ich also einen Wert in Sub_Item_Id und null in Sub_Item_Site_Id habe, betrachtet die Abfrage dies NICHT als !=.

Warum?


Getestet habe ich auch die gleiche Abfrage mit

SQL
select 
    * 
from 
    orders as o 
where 
    LEFT(o.sub_item_id, 10) <> LEFT(o.sub_item_site_id, 10) 

Und ich das gleiche Ergebnis. Ich habe alle meine verschiedenen Werte, aber nicht, wenn ich einen Wert in o_item_id und null in o_item_site_id habe.

Können Sie erklären, wie und warum SQL und Linq so funktioniert.

Antwort

1

Substring()nicht null ignorieren, in der Abfrage, wenn einer der Strings null sein wird, Sie NullPointerException erhalten wird und wenn eine der String kürzer als 10 Zeichen ist, erhalten Sie ArgumentOutOfRangeException:

https://msdn.microsoft.com/library/aka44szs(v=vs.110).aspx

Überprüfen Sie Ihre Daten und Ihre Abfrage.

+0

Sorry, aber wenn das System Exceptions generieren und diese Exception vom System selbst behandelt werden, ist das Ergebnis, das System etwas zu ignorieren. Ja ok. Daher ignoriert die Linq-Abfrage diese Zeile, weil Sie glauben, dass das System eine Ausnahme generiert. Was ist mit der SQL-Abfrage? Same, erzeugt die LEFT() Ausnahme? –

0

Relationale Ausdrücke, die NULL beinhalten, ergeben tatsächlich NULL. Um Nullwerte zu filtern, müssen Sie IS NULL und IS NOT NULL verwenden. Sie können eine Antwort here finden.

0

Sie können ein Tag hinzufügen, das angibt, dass Ihr LinQ im Hintergrund eine Verbindung zu einer Datenbank herstellt, um SQL dort auszuführen. Ohne diese Information hat Maksim Recht. In normalen Linq-to-Objects C# würden Sie die entsprechenden Ausnahmen erhalten.

Da jedoch Ihr LinQ als SQL übersetzt und ausgeführt wird, haben Sie gerade eine überraschend nicht intuitive SQL-Funktion gefunden: NULL ist nie gleich zu etwas anderem. Nicht einmal NULL. Und NULL ist nie ungleich zu etwas anderem. Nicht einmal ein Wert oder ein anderer NULL. Es nur nie ergibt im Vergleich wahr, was auch immer Sie es vergleichen.

Sie können die IS Syntax verwenden, um zu fragen, ob etwas NULL ist. Oder Sie können NULL durch einen Standardwert ersetzen, bevor Sie Ihre Aussage machen. Aber das Vergleichen vorhandener Werte und NULL ergibt immer false, weil NULL nichts ist, nicht einmal NULL selbst.

Verwandte Themen