.IsNotEqualTo不会比较Null

时间:2009-05-27 16:05:11

标签: c# .net subsonic

此查询仅返回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>();`

3 个答案:

答案 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)