Этот запрос будет возвращать только все записи, где 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>();`
Используйте 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>();`
В 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
Надеюсь, это даст вам некоторое представление о том, что происходит под капотом.
Добавьте коалесцирующий оператор в ваше предложение И, в результате чего NULLS будет "ложным"
.And(User.Columns.Exempt ?? false).IsNotEqualTo(true)