使用StartsWith进行Lambda筛选在c#中不起作用

时间:2018-08-30 20:23:16

标签: c# entity-framework linq lambda

我正在使用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

2 个答案:

答案 0 :(得分:3)

为什么要砍掉另一个原因是对查询的优化:

如果searchstring.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));