2009-05-27 17 views
2

Diese Abfrage gibt nur alle Datensätze zurück, bei denen Active = true und Exempt = false ist. Es sollte auch alle Datensätze zurückgeben, bei denen Active = true und Exempt IS NULL ist. Ich denke, die. IsNotEqualTo nicht mit irgendwelchen Datensätzen mit einem Nullwert vergleichen? Gibt es einen Weg um dies ohne einen Standard zu setzen?.IsNotEqualTo vergleicht keine Nullwerte

UserCollection ActiveUsersNotExempt = new UserCollection(); 
ActiveUsersNotExempt = DB.Select().From<User>() 
       .Where(User.Columns.Active).IsEqualTo(true) 
       .And(User.Columns.Exempt).IsNotEqualTo(true) 
       .ExecuteAsCollection<UserCollection>();` 

Antwort

4

Verwenden AndExpression wie folgt eine verschachtelte Einschränkung zu erhalten (Exempt nicht wahr ist oder null):

UserCollection ActiveUsersNotExempt = DB.Select().From<User>() 
    .Where(User.Columns.Active).IsEqualTo(true) 
    .AndExpression(User.Columns.Exempt).IsNotEqualTo(true) 
    .Or(User.Columns.Exempt).IsNull() 
    .ExecuteAsCollection<UserCollection>();` 
+0

Danke, das habe ich gebraucht. – Scott

1

einen koaleszierenden Operator Ihre AND-Klausel hinzufügen, so dass NULLS "false"

.And(User.Columns.Exempt ?? false).IsNotEqualTo(true) 
+0

Er sagt, dass ?? kann nicht auf string oder bool angewendet werden – Scott

+0

Dies wird einen Kompilierungsfehler verursachen, und() muss einen Spaltennamen als String –

+0

Gotcha nehmen. Ich habe es nicht selbst versucht, nur eine Idee, die ich hatte. Vielen Dank. –

2

In SQL werden, angewendet Betreiber nicht zurück auf Null wahr oder falsch - stattdessen null zurück sie. (Eine Ausnahme von dieser Regel ist der Operator "IS").

Das heißt, der Ausdruck exempt != true ist falsch, wenn die Ausnahme wahr ist, wahr, wenn die Ausnahme falsch ist, und null, wenn die Ausnahme null ist.

Wenn Sie Ihren Zustand wollen übereinstimmen, wenn befreit falsch oder null ist, müssen Sie eine Abfrage wie konstruieren:

active = true AND (exempt = false OR exempt IS NULL) 

oder

active = true AND COALESCE(exempt, false) = false 

Hoffentlich gibt Ihnen einen Einblick in das, was los ist unter der Haube.

+0

Danke, ich wusste, wie man das in SQL macht, war mir einfach nicht sicher, wie es in Subsonic übersetzt wurde! – Scott