我正在使用Lambda表达式进行搜索。我正在搜索3个字段,即姓名,地址,电子邮件。我已经在控制器视图中编写了以下lambda表达式:
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]
很显然,缺少原因所在。因此它将返回所有记录而不进行过滤。我不确定是什么问题。有任何线索吗?
谢谢
Partha
答案 0 :(得分:3)
为什么要砍掉另一个原因是对查询的优化:
如果search
是string.Empty
然后
"your string".StartsWith(string.Empty)
总是返回true。
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,如果是的话:提交错误。
答案 1 :(得分:1)
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));