Linq, где column == (нулевая ссылка) не совпадает с column == null - PullRequest
23 голосов
/ 20 января 2010

Я столкнулся с довольно странной проблемой с linq-to-sql. В следующем примере

var survey = (from s in dbContext.crmc_Surveys
                                   where (s.crmc_Retail_Trade_Id == tradeId) && (s.State_.Equals(state))
                                   select s).First();

Если tradeId равен нулю, он не будет вести себя так, как будто я определил ноль специально, как это,

var survey = (from s in dbContext.crmc_Surveys
                                   where (s.crmc_Retail_Trade_Id == null) && (s.State_.Equals(state))
                                   select s).First();

Какое мое желаемое поведение. Фактически он ничего не возвращает, если оба значения не равны NULL. Я не могу понять, как выполнить этот короткий из нескольких различных запросов linq. Есть идеи?

Ответы [ 4 ]

30 голосов
/ 20 января 2010

Изменение where (s.crmc_Retail_Trade_Id == tradeId) до

where (s.crmc_Retail_Trade_Id == tradeId || 
      (tradeId == null && s.crmc_Retail_Trade_Id == null))

Редактировать - на основании этого поста от Бранта Ламборна, похоже, что следующее будет делать то, что вы хотите:

where (object.Equals(s.crmc_Retail_Trade_Id, tradeId))

Нулевая семантика (LINQ to SQL) Страница MSDN ссылается на некоторую интересную информацию:

LINQ to SQL не навязывает C # нуль или Visual Basic ничего не сравнить семантика на SQL. Операторы сравнения синтаксически переводятся на их SQL-эквиваленты. Семантика отражает Семантика SQL, как определено сервером или Настройки соединения. Два нулевых значения считаются неравными по умолчанию Настройки SQL Server (хотя вы можете изменить настройки, чтобы изменить семантика). Независимо от того, LINQ to SQL не учитывает настройки сервера в перевод запроса.

Сравнение с буквальным нулем (ничего) переводится на соответствующая версия SQL (нулевая или ненулевой).

Значение ноль (ничего) в сопоставление определяется SQL Server; LINQ to SQL не меняет сверка.

2 голосов
/ 20 сентября 2016

Еще один вариант решения этой проблемы, так как я столкнулся и с этой проблемой.

where (tradeId == null ? s.crmc_Retail_Trade_Id == null : s.crmc_Retail_Trade_Id == tradeId)
2 голосов
/ 20 января 2010

Не уверен в этом, но я подозреваю, что когда linq-to-sql преобразует это в строку запроса sql, вы получаете немного другое выражение, указывающее null напрямую, так что в какой-то момент вы в конечном итоге сравниваете NULL с самим собой, иNULL = NULL определено как ложное.

1 голос
/ 20 января 2010

Я не знаком с Linq, но в целом:

NULL представляет отсутствующее, неизвестное или неопределенное значение. Строго говоря, переменная не может быть равна NULL; Языки низкого уровня, которые предоставляют эту конструкцию, обычно делают это для удобства, потому что нет легкой альтернативы - на более высоком уровне обычно лучше полагаться на ISNULL, defined или на то, что поддерживает ваш язык.

Одна неопределенная переменная не равна другой неопределенной переменной (то же самое относится и к NULL == NULL). У Джо Селко есть хороший пример написания запроса, чтобы найти всех людей, чей цвет волос соответствует цвету автомобиля, на котором они едут. Должен ли этот запрос соответствовать лысому мужчине, который ходит повсюду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...