Обработка нулевых значений в предложении where с использованием LINQ-to-SQL

Запрос LINQ-to-SQL в Visual Studio генерирует SQL-запрос с ошибками. В LINQPad тот же запрос LINQ, использующий одну и ту же базу данных (или DataContext), работает нормально.

Запрос LINQ

var accesDomaines = from t in db.Access
                  where t.IdUser == access.IdUtilisateur
                  where t.IdDomain != null
                  where t.IdRole == access.IdRole
                  where t.IdPlace == access.IdPlace
                  select t;

Здесь небольшая часть сгенерированного SQL, где возникает ошибка:

WHERE (...) AND ([t3].[IdRole] = ) AND (...)

После равных в том месте, там буквально ничего! В SQL-запросе LINQPad мы видим предложение where:

WHERE (...) AND ([t3].[IdRole] IS NULL) AND (...)

Когда я сравниваю два сгенерированных SQL-запроса от VS и LINQPad, по очереди, это одно и то же. Кроме того, LINQPad использует параметры, а также отсутствующую правую часть равенства в where, где указано Visual Studio, как показано выше.


Примечание 1

В запросе LINQ я попытался использовать этот синтаксис в тех случаях, когда:

where t.IdRole.Equals(acces.IdRole.Value)

Но также порождает плохой результат. Я даже пробовал что-то вроде этого перед запросом LINQ:

if (!acces.IdRole.HasValue) { acces.IdRole = null; }

Примечание 2

Свойства представляют собой целые числа с нулевым значением. Я хочу, чтобы null в запросе, если свойство равно null. Очевидно, что я хочу значение свойства, если есть значение.

Примечание 3

Я пробовал предложение, сделанное в этом вопросе: Linq, где column == (нулевая ссылка) не совпадает с столбцом == null

... без успеха.


Любое объяснение двух похожих запросов LINQ, но генерирование хорошего и плохого SQL-запроса? Любое предложение решить эту проблему?

Спасибо!

Ответ 1

попробуйте следующее:

where object.Equals(t.IdRole, access.IdRole)

Ответ 2

Используйте

object.Equals()

.Net позаботится о создании правильного sql для нулевого условия.

Пример:

Скажите, что у вас есть уличный стол с такими столбцами, как Suffix и Prefix. Тогда следующий запрос linq не работает:

  string suffix = "ST";
  string prefix = null;

  var map = from s in Streets
            where s.Suffix==suffix || s.Prefix==prefix
            select s;

Он будет генерировать следующий sql:

SELECT [t0].[StreetId], [t0].[Prefix], [t0].[Suffix]
FROM [Street] AS [t0]
WHERE ([t0].[Suffix] = @p0) AND ([t0].[Prefix] = @p1)

мы можем ясно видеть, что он не вернет никакого результата.

Использование object.Equals():

  string suffix = "ST";
  string prefix = null;

  var map = from s in Streets
  where object.Equals(s.Suffix, suffix) && object.Equals(s.Prefix,prefix)
  select s;

будет генерировать sql:

SELECT [t0].[StreetId], [t0].[Prefix], [t0].[Suffix]
FROM [Street] AS [t0]
WHERE ([t0].[Suffix] IS NOT NULL) AND ([t0].[Suffix] = @p0) 
         AND ([t0].[Prefix] IS NULL)

Какой правильный.

(Немного поздно, но хотел расширить ответ для других)

Ответ 3

Пробовали ли вы проверять, были ли у ваших свойств значения с свойством HasValues, предоставленным Nullables?

where t.IdRole == access.IdRole.HasValues ? access.IdRole.Value : null

Возможно, это может сработать. Я действительно не использовал LINQ-to-SQL.