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

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

LINQ Query

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 (...)

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

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

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


Примечание 1

В запросе LINQ я попытался использовать этот синтаксис в предложениях where:

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

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

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

Примечание 2

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

Примечание 3

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

... безуспешно.


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

Спасибо!

Ответы [ 3 ]

10 голосов
/ 09 марта 2010

попробуйте это:

where object.Equals(t.IdRole, access.IdRole)
5 голосов
/ 27 марта 2013

Использование

object.Equals()

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

Пример:

Допустим, у вас есть таблица улиц с такими столбцами, как Суффикс и Префикс. Тогда следующий запрос 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)

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

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

0 голосов
/ 09 марта 2010

Вы пытались проверить, имеют ли ваши свойства значения с помощью свойства HasValues, предоставленного Nullables?

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

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

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