Я пытаюсь записать linq к запросу SQL, использующий ||, который ведет себя тот же путь как ИЛИ в SQL в сочетании с ЛЮБЛЕНИЕМ/СОДЕРЖАНИЕМ.
SQL:
SELECT * FROM Users
WHERE GroupNumber = 'A123456'
OR (FirstName LIKE 'Bob%' AND LastName LIKE 'Smith%')
Это приведет ко всем с именем как "Bob Smith", а также все с GroupNumber точно равняются A123456. В моей базе данных sql пример дает мне три результата (Желаемый результат):
A123456 John Davis A312345 Bob Smith A123456 Matt Jones
Linq: (если PNum = A123456; сначала = "Bob"; в последний раз = "Smith")
var users = from a in dc.Users
where a.PolicyNumber == PNum || (SqlMethods.Like(a.FirstName, first + "%") && SqlMethods.Like(a.LastName, last + "%"))
orderby a.PolicyNumber, a.FirstName
select a;
Это только даст мне результаты на левой стороне ||:
A123456 John Davis A123456 Matt Jones
Я также попробовал a. Содержит () и a. StartsWith (), но с каждой версией я получаю те же два результата. Когда я удаляю любой Like/Contain/StartsWith, я получаю желаемый результат, но мне нужно к подстановочному знаку. Как я получаю все три результата в запросе Linq?
Я бы определенно использовал StartsWith
в этом случае, просто чтобы сделать код более похожим на C # при чтении - но это должно работать:
var users = from a in dc.Users
where a.PolicyNumber == PNum
|| (a.FirstName.StartsWith(first) && a.LastName.StartsWith(last))
orderby a.PolicyNumber, a.FirstName
select a;
Если это запрос не работает, не могли бы вы опубликовать сгенерированный им SQL? Просто установите журнал контекста, чтобы он записывал его в консоль, или что-то еще проще. (Я бы написал консольное приложение только для проверки этой проблемы - это будет проще, чем запускать пользовательский интерфейс каждый раз.)
Ваш запрос выглядит корректно.
Пробовали ли вы посмотреть в лог, чтобы увидеть, какой SQL выдается?