【发布时间】:2018-08-30 20:23:16
【问题描述】:
我正在使用 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 原因。所以它返回所有记录而不过滤。我不确定是什么问题。有什么线索吗?
谢谢
帕萨
【问题讨论】:
-
it is generating following sql: 你是怎么测试的? -
StartsWith 和 ToUpper 的组合对我来说看起来很臭。您可以尝试将大写字符串存储在新的 c# 变量中并将其传递给 StartsWith 吗?
-
所有非空字符串以
string.Empty.开头:见dotnetfiddle.net/ON22le -
"调试时获取sql。"没错,但是如果您的代码看起来像您所显示的那样,我认为您很可能以错误的方式获取 SQL。尝试将您的 IQueryable(ToList() 调用之前的所有内容)提取到一个单独的变量中。然后在声明该变量后停止并检查该 IQueryable 上的
ToString()。仔细检查search是否具有您认为的值也是很好的。 -
确保您始终可以在数据库上运行分析器 :-)
标签: c# entity-framework linq lambda