2016-08-08 6 views
0

Ich habe eine Linq zu SQL-Abfrage, die (meiner Meinung nach) sehr seltsam verhält, wenn ich nach Null-Werten überprüfen.Linq zu SQL-Prüfung auf Null Fremdheit

Es gibt einen Datensatz in der DB wie von der letzten Linq gezeigt, aber warum zeigen die ersten beiden Abfragen den Datensatz nicht?

//Check 
(record.SomeID == null ? "Yes" : "No"); //This prints Yes 

//LINQ 
var q = (from t in mySQLTable 
     where t.PKID == record.PKID && 
     t.SomeID == record.SomeID 
     select t).FirstOrDefault(); 
//This prints nothing. I.e. no records found 

var q2 = (from t in mySQLTable 
      where t.PKID == record.PKID && 
      t.SomeID == (record.SomeID == null ? null : record.SomeID) 
      select t).FirstOrDefault(); 
//This also prints nothing. I.e. no records found 

var q3 = (from t in mySQLTable 
      where t.PKID == record.PKID && 
      t.SomeID == null 
      select t).FirstOrDefault(); 
//This prints 1 record 
+0

einfach "null = null" bewerten ist immer falsch. – Rumpelstinsk

+1

@Rumpelstinsk Sind Sie sicher? Versuchen Sie es :) – user3185569

+1

Führen Sie Profiler und vergleichen Sie Ergebnis SQLs, ich denke, Sie werden verstehen, was schief geht – Nigrimmist

Antwort

1

können Sie dieses Problem überwinden, die unter Abfrage:

bool isNull = record.SomeID == null; 

var q = (from t in mySQLTable 
     where t.PKID == record.PKID 
     && ((isNull && t.SomeID == null) 
      || 
       (!isNull && t.SomeID == record.SomeID) 
      ) 
     select t).FirstOrDefault(); 
+0

Ja, das funktioniert. Dies kann jedoch ziemlich schwierig zu lesen (und viel Arbeit), wenn Sie eine Anzahl von IDs, die Sie überprüfen. Vielleicht ist eine Erweiterungsmethode die Antwort, wenn diese häufig verwendet wird. Vielen Dank. –