.IsNotEqualTo не сравнивает Nulls - PullRequest
2 голосов
/ 27 мая 2009

Этот запрос вернет только все записи, где 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 ]

3 голосов
/ 27 мая 2009

Используйте AndExpression следующим образом, чтобы получить вложенное ограничение (Exempt не верно или равно нулю):

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>();`
2 голосов
/ 27 мая 2009

В SQL операторы, применяемые к null, не возвращают true или false - вместо этого они возвращают null. (Единственным исключением из этого правила является оператор «IS»).

Другими словами, выражение exempt != true является ложным, когда освобождение равно true, истинным, когда освобождение является ложным, и нулевым, если освобождение является нулевым.

Если вы хотите, чтобы ваше условие соответствовало, когда исключение равно false ИЛИ пусто, вам нужно создать запрос, подобный:

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

или

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

Надеюсь, это даст вам некоторое представление о том, что происходит под капотом.

1 голос
/ 27 мая 2009

Добавить оператор объединения в предложение AND, в результате чего NULLS будет иметь значение «false»

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