Лямбда-фильтрация с использованием StartsWith не работает в C # - PullRequest
0 голосов
/ 30 августа 2018

Я использую лямбда-выражение для поиска. Я ищу по 3 полям, т. Е. Имя, адрес, адрес электронной почты. Я написал следующее лямбда-выражение в виде контроллера:

return View(db.SalesPersons.Where(x => x.Name.StartsWith(search.ToUpper()) || x.Address.StartsWith(search.ToUpper()) || x.Email.StartsWith(search.ToUpper())).ToList().ToPagedList(page ?? 1, 3));

Но когда я отлаживаю приложение, оно генерирует следующий sql:

SELECT 
    [Extent1].[IID] AS [IID], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[Pin] AS [Pin], 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Password] AS [Password], 
    [Extent1].[ContactNo1] AS [ContactNo1], 
    [Extent1].[ContactNo2] AS [ContactNo2], 
    [Extent1].[Email] AS [Email]
    FROM [dbo].[SalesPerson] AS [Extent1]

Очевидно, что причина отсутствует. Таким образом, он возвращает все записи без фильтрации. Я не уверен, в чем проблема. Любая подсказка?

Спасибо

Парта

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Еще одна причина, по которой нужно отрубить где это оптимизация запроса:

, если search равно string.Empty

тогда

"your string".StartsWith(string.Empty)

всегда возвращает истину.


С другой стороны:
string s = null;
s.StartsWith(string.Empty);

выдаст ошибку.


Чтобы убедиться, что ваша переменная search имеет соответствующее значение, вы можете сделать следующее, чтобы исключить регистр string.Empty:

var newSearch = "hi".ToUpper();
db.SalesPersons.Where(x => x.Name.StartsWith(newSearch) ||
                           x.Address.StartsWith(newSearch) || 
                           x.Email.StartsWith(newSearch))

Не помогает? Вы можете попробовать профилировщик, чтобы убедиться, что это фактический SQL, который идет в базу данных, если он есть: сообщить об ошибке.

0 голосов
/ 30 августа 2018

Одной из причин, по которой предложение WHERE может быть отключено, является провайдер EF, который не распознает ToUpper и решает выполнить эту часть запроса в памяти.

Это можно исправить, выполнив ToUpper вне запроса, например:

var upperSearch = search.ToUpper();
return View(db.SalesPersons.Where(x =>
    x.Name.StartsWith(upperSearch)
||  x.Address.StartsWith(upperSearch)
||  x.Email.StartsWith(upperSearch)
).ToList().ToPagedList(page ?? 1, 3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...