От Linq до SQL, чтобы отобразить обнуляемое значение bool для IsNull, а не = NULL - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь использовать Linq для SQL, чтобы отфильтровать таблицу с помощью значения bool, допускающего обнуляемое значение, основанное на переменной.

Но если значение переменной равно NULL, LINQ, кажется, переводит запрос в Field = NULL вместо Field IS NULL.

Основано на других сообщениях, которые я видел, чтобы использовать object.Equals для правильного сопоставления. И это работает, но только когда значение переменной равно нулю.

Пример кода:

    bool? relevantValue = null;
    var q = from m in MyTable
             where ???
             select m;

Случай 1:

Если условие where равно object.Equals(m.IsRelevant, relevantValue), оно работает, когда relevantValue равно нулю и true, но возвращает неверные результаты, когда relevantValue = false. Он преобразуется в SQL в

ГДЕ ((СЛУЧАЙ КОГДА [t0]. [IsRelevant] = 1 ТОГДА 1 ИЛИ 0 КОНЕЦ)) = 0

Случай 2: Для where (relevantValue == null ? object.Equals(m.IsRelevant, relevantValue) : m.IsRelevant == relevantValue) он работает для relevantValue = true или false, но когда null выдает ошибку, которая:

Аргумент 'value' был неправильного типа. Ожидаемый «System.Boolean». Фактический 'System.Nullable`1 [System.Boolean]'.

Есть ли у меня другие параметры, которые будут работать для значений null, true и false?

1 Ответ

0 голосов
/ 14 января 2020

Может быть, я что-то упустил в вопросе, но почему бы не использовать Nullable <> .HasValue и .Value для получения реального логического значения?

IQueryable<Person> People = new List<Person>
{
    new Person
    {
        PersonId = 1,
        IsMarried = true
    },
    new Person
    {
        PersonId = 2,
        IsMarried = false
    },
}
.AsQueryable();

bool? isMarried = null;
var query = from p in People
            where !isMarried.HasValue || (isMarried.HasValue && p.IsMarried == isMarried.Value)
            select p;
...