.IsNotEqualTo не сравнивает Nulls

2

Этот запрос будет возвращать только все записи, где 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>();`
Теги:
subsonic

3 ответа

3
Лучший ответ

Используйте AndExpression следующим образом, чтобы получить вложенное ограничение (исключение не истинно или равно 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
    Спасибо, это то, что мне было нужно.
2

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

То есть выражение exempt != true является ложным, если исключение истинно, true, если исключение является ложным, а null, когда исключение - null.

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

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

или

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

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

  • 0
    Спасибо, я знал, как это сделать в SQL, просто не знал, как это перевести на Subsonic!
1

Добавьте коалесцирующий оператор в ваше предложение И, в результате чего NULLS будет "ложным"

.And(User.Columns.Exempt ?? false).IsNotEqualTo(true)
  • 0
    Это говорит что ?? не может быть применен к строке или bool
  • 0
    Это приведет к ошибке компиляции, а And () необходимо принять имя столбца в виде строки
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню