Каков наилучший способ справиться с обнуляемыми строковыми столбцами в LinqToSql? - PullRequest
2 голосов
/ 20 мая 2011

Предположим, у вас есть таблица с пустым столбцом varchar. Когда вы пытаетесь отфильтровать таблицу, вы должны использовать (параметр pFilter):

var filter = pFilter;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();

Теперь, что, если есть ключевое слово, которое означает "Все нули". Код будет выглядеть так:

var filter = pFilter != "[Nulls]" ? pFilter : null;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();

Но это не работает. По-видимому, строка со значением NULL является ... не NULL?

Однако, что работает этот код:

var filter = pFilter != "[Nulls]" ? pFilter : null;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter || (filter == null && x.MyColumn == null)).ToList();

Обходной путь не убедил меня, поэтому мой вопрос таков: как лучше всего обращаться со столбцами строк, допускающих обнуляемость, в LinqToSql?

1 Ответ

3 голосов
/ 20 мая 2011

Используйте String.Equals, чтобы LINQ правильно обрабатывал ноль в сгенерированном SQL-запросе

var result = dataContext.MyTable
                        .Where(x => String.Equals(x.MyColumn, filter))
                        .ToList();

Edit:

Если вы используете == LINQ сгенерирует запрос для общего случая WHERE [column] = @parameter, но в SQL NULL не совпадает с NULL, правильный способ проверки на NULL - [column] IS NULL.

С String.Equals LINQ имеет достаточно информации для перевода метода в соответствующее предложение в каждом случае, что означает:

если вы передадите ненулевую строку, это будет

WHERE ([column] IS NOT NULL) AND ([column] = @parameter)

и, если он нулевой

WHERE [column] IS NULL
...