2009-05-27 7 views
2

Cette requête renverra uniquement tous les enregistrements où Active = true et Exempt = false. Il devrait retourner tous les enregistrements où Active = true et Exempt IS NULL. Je suppose que le .IsNotEqualTo ne se compare à aucun enregistrement avec une valeur nulle? Y at-il un moyen de contourner cela sans définir de valeur par défaut?.IsNotEqualTo ne compare pas Nulls

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

Répondre

4

Utilisez AndExpression comme suit pour obtenir une contrainte imbriquée (Exempt est pas vrai ou est nulle):

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

Merci, c'est ce dont j'avais besoin. – Scott

1

Ajouter un opérateur coalescent à votre clause AND, ce qui NULLS à être "false"

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

Il dit que ?? ne peut pas être appliqué à une chaîne ou un booléen – Scott

+0

Cela provoquera une erreur de compilation, et() doit prendre un nom de colonne comme une chaîne –

+0

gotcha. Je ne l'ai pas essayé moi-même, juste une idée que j'avais. Merci. –

2

Dans SQL, les opérateurs appliqués à null ne renvoient pas vrai ou faux - au lieu de leur retour nul. (Une exception à cette règle est l'opérateur "IS"). C'est-à-dire que l'expression exempt != true est fausse si elle est exempte, vraie si elle est fausse, et nulle si elle est nulle.

Si vous voulez que votre état pour correspondre lorsque exempté est faux ou nul, vous devez construire une requête comme:

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

ou

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

Espérons que cela vous donne un aperçu de ce qui se passe sous le capot.

+0

Merci, je savais comment faire cela en SQL, je ne savais pas comment ça se traduisait en Subsonic! – Scott

Questions connexes