Я пытаюсь выполнить скомпилированный SQL-запрос из LINQ, который будет проверять, является ли query
подстрокой любого из трех столбцов в базе данных (без учета регистра).
Я использую .NET Core 1.1
Запрос, который я придумал, выглядит следующим образом:
users.Select(u => new
{
User = u,
query = u.FirstName.ToLower() + u.LastName.ToLower() + u.Email.ToLower()
}).Where(x => x.query.Contains(query))
Но при просмотре информации об отладке я получаю следующее предупреждение:
Выражение LINQ '(([u] .FirstName.ToLower () + [u] .LastName.ToLower ()) + [u] .Email.ToLower () ». Contains (__ query_0)' не может быть переведено и будет оценивается на местном уровне.
Второй запрос, который я пробовал:
users.Where(x => u.FirstName.ToLower().Contains(query) || u.LastName.ToLower().Contains(query) || u.Email.ToLower().Contains(query))
но он дает мне точно такое же предупреждение.
Почему так? Я ищу что-то вроде:
SELECT * FROM USERS WHERE FirstName LIKE query OR LastName LIKE query OR Email LIKE query
ОБНОВЛЕНИЕ
Провел еще один эксперимент:
users.Where(u =>
u.FirstName.Contains(query) ||
u.LastName.Contains(query) ||
u.Email.Contains(query));
И это тоже привело к
Выражение LINQ '(([u] .FirstName.Contains (__ query_0) OrElse [u] .LastName.Contains (__ query_1)) OrElse [u] .Email.Contains (__ query_2) »не может быть переведено и будет оцениваться локально. .
xxx_CI
,.ToLower()
.SELECT CONVERT (varchar, SERVERPROPERTY('collation'));
для проверки. - person Magnus   schedule 26.10.2017SQL_Latin1_General_CP1_CI_AS
. Однако я думаю (возможно, я ошибаюсь), что когда мой запрос не скомпилирован в SQL, он будет чувствителен к регистру. - person MaLiN2223   schedule 26.10.2017[email protected]
. Если пользователь ищет Джонни, он получит доступ к Джону Найману, даже если Джонни не встречается ни в имени, ни в фамилии, ни в адресе электронной почты. Также обратите внимание, что вы получите разные результаты, если поменяете порядок конкатенации: указание фамилии первым ([email protected]
) внезапно не даст результатов для Джонни. - person Flater   schedule 26.10.2017