Ответ 1
попробуйте следующее:
where object.Equals(t.IdRole, access.IdRole)
Запрос LINQ-to-SQL в Visual Studio генерирует SQL-запрос с ошибками. В LINQPad тот же запрос LINQ, использующий одну и ту же базу данных (или DataContext), работает нормально.
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, как показано выше.
В запросе LINQ я попытался использовать этот синтаксис в тех случаях, когда:
where t.IdRole.Equals(acces.IdRole.Value)
Но также порождает плохой результат. Я даже пробовал что-то вроде этого перед запросом LINQ:
if (!acces.IdRole.HasValue) { acces.IdRole = null; }
Свойства представляют собой целые числа с нулевым значением. Я хочу, чтобы null в запросе, если свойство равно null. Очевидно, что я хочу значение свойства, если есть значение.
Я пробовал предложение, сделанное в этом вопросе: Linq, где column == (нулевая ссылка) не совпадает с столбцом == null
... без успеха.
Любое объяснение двух похожих запросов LINQ, но генерирование хорошего и плохого SQL-запроса? Любое предложение решить эту проблему?
Спасибо!
попробуйте следующее:
where object.Equals(t.IdRole, access.IdRole)
Используйте
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)
Какой правильный.
(Немного поздно, но хотел расширить ответ для других)
Пробовали ли вы проверять, были ли у ваших свойств значения с свойством HasValues, предоставленным Nullables?
where t.IdRole == access.IdRole.HasValues ? access.IdRole.Value : null
Возможно, это может сработать. Я действительно не использовал LINQ-to-SQL.