首页 > 解决方案 > 使用 StartsWith 的 Lambda 过滤在 c# 中不起作用

问题描述

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

很明显,缺少 where 原因。所以它返回所有记录而不过滤。我不确定是什么问题。有什么线索吗?

谢谢

帕塔

标签: c#entity-frameworklinqlambda

解决方案


砍掉 where 的另一个原因是查询的优化:

如果searchstring.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,如果是:提交错误。


推荐阅读