此查询仅返回Active = true和Exempt = false的所有记录。它应该返回任何记录,其中Active = true和Exempt IS NULL。我猜.IsNotEqualTo不会与任何具有空值的记录进行比较?有没有办法解决这个问题而没有设置默认值?
UserCollection ActiveUsersNotExempt = new UserCollection();
ActiveUsersNotExempt = DB.Select().From<User>()
.Where(User.Columns.Active).IsEqualTo(true)
.And(User.Columns.Exempt).IsNotEqualTo(true)
.ExecuteAsCollection<UserCollection>();`
答案 0 :(得分:3)
使用AndExpression如下获取嵌套约束(Exempt不为true或为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>();`
答案 1 :(得分:2)
在SQL中,应用于null的运算符不返回true或false - 而是返回null。 (此规则的一个例外是“IS”运算符)。
也就是说,当exempt为true时,表达式exempt != true
为false,当exempt为false时为true,在exempt为null时为null。
如果您希望条件在exempt为false或null时匹配,则需要构造如下查询:
active = true AND (exempt = false OR exempt IS NULL)
或
active = true AND COALESCE(exempt, false) = false
希望这能让您深入了解幕后发生的事情。
答案 2 :(得分:1)
在AND子句中添加合并运算符,导致NULLS为“false”
.And(User.Columns.Exempt ?? false).IsNotEqualTo(true)