НРАВИТСЯ, ИЛИ и прочее в Linq - PullRequest
7 голосов
/ 20 июля 2010

Я пытаюсь написать запрос linq-to-sql, используя || который ведет себя так же, как OR в SQL, в сочетании с LIKE / Contains.

SQL

SELECT * FROM Users
WHERE GroupNumber = 'A123456'
OR (FirstName LIKE 'Bob%' AND LastName LIKE 'Smith%')

Это приведет к тому, что все будут иметь имя, такое как «Боб Смит», а также все с GroupNumber, точно равным A123456. В моей базе данных, пример sql дает мне три результата (желаемый результат):

A123456   John Davis
A312345   Bob Smith
A123456   Matt Jones

Linq : (при условии PNum = A123456; first = "Bob"; last = "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.Contains () и a.StartsWith (), но с каждой версией я получаю одинаковые два результата. Когда я удаляю Like / Container / StartsWith, я получаю желаемый результат, но мне нужно подстановочный знак. Как получить все три результата в запросе Linq?

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Я бы определенно использовал 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?Просто установите журнал контекста, чтобы записать его на консоль, или что-нибудь простое.(Я бы написал консольное приложение просто для проверки этой проблемы - это будет проще, чем запускать интерфейс каждый раз.)

0 голосов
/ 20 июля 2010

Ваш запрос выглядит правильно для меня.

Вы пытались просмотреть журнал, чтобы увидеть, какой SQL излучается?

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