Конкатенация строк в LINQ to SQL - PullRequest
5 голосов
/ 08 июля 2011

Есть ли способ создать Where лямбду на конкатенации двух строковых полей, чтобы он правильно делал это в SQL?Скажем, у меня есть человек, и есть два поля, FirstName и LastName.Я хочу иметь возможность фильтровать по их полному имени, которое показано на странице как FirstName + LastName.

. Я не могу использовать комбинированное свойство, такое как FullName в лямбда-выражении linq, поскольку в SQL нетИдея, что это такое, и выдает ошибку.Я мог бы сначала выполнить запрос, используя .AsEnumerable() перед Where, но это менее эффективно (я так думаю?)

Я попытался .Where(p => (p.FirstName + p.LastName).Contains(filterText)), и это работает без ошибок, но на самом деле может толькофильтр по одному за раз.Это похоже на то, что в результате sql говорит WHERE FirstName LIKE %text% OR LastName LIKE %text%, а не ищет конкатенацию.Это означает, что у меня не может быть текста фильтра моего имени и фамилии.Если я ищу "hn Do" в "John Doe", я не получаю результатов.

Так есть ли правильный способ сделать это в LINQ или я должен согласиться на альтернативное решение?

1 Ответ

6 голосов
/ 08 июля 2011

Попробуйте:

.Where(p => (p.FirstName + " " + p.LastName).Contains(filterText))

В противном случае вы проверяете «hn Do» против «JohnDoe», что, конечно, не будет совпадать.

PS

Это не ошибка в LINQ to SQL. Ваш запрос очень четко запрашивает ожидаемое поведение, которое вы не ищете.

1010 * ПФС * Довольно легко увидеть, какой SQL ваш запрос LINQ генерирует с помощью LINQPad. В случае вашего исходного запроса он выдает что-то вроде следующего: DECLARE @p0 NVarChar(1000) = '%hn Do%' SELECT [t0].[PersonId], ... FROM [Person] AS [t0] WHERE ([t0].[FirstName] + [t0].[LastName]) LIKE @p0

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