使用多个包含语句优化实体框架查询
本文关键字:优化 实体 框架 查询 语句 包含 | 更新日期: 2024-10-25 07:45:47
我正在尝试优化一个查询,执行大约需要 6 秒。
string[] filters = ...;
var data =
(from n in ctx.People
.Where(np => np.IsActive)
let isFilterMatch = filters.All(f => n.FirstName.ToLower().Contains(f) ||
n.Prefix.ToLower().Contains(f) ||
n.MiddleName.ToLower().Contains(f) ||
n.LastName.ToLower().Contains(f) ||
n.Information.Email.ToLower().Contains(f) ||
(n.Address!= null &&
(SqlFunctions.StringConvert((double)n.Address.Number).
Contains(f) ||
n.Address.Street.ToLower().Contains(f) ||
n.Address.ZipCode.ToLower().Contains(f) ||
n.Address.City.ToLower().Contains(f))))
where isFilterMatch
orderby n.LastName
select n
).Take(numberOfItems).ToList();
这是对搜索对话框的查询。用户可以键入任何文本,然后它将搜索与输入匹配的人员。我们将用户输入拆分为一个字符串数组,然后在 Person 字段上执行包含。由于筛选器数组,无法预编译查询。
如何优化此功能?我听说过Sql Server上的FullTextSearch或存储过程之类的东西。这有帮助吗?
我们使用的是 Sql Server 2008、实体框架 4.0(模型优先)和 C#。
我不会为此搜索查询使用 SQL 查询/Linq 查询。文本搜索的正常查询可能很慢,并且只返回确切的结果;他们不纠正拼写/语法错误等。
您可以考虑使用 SQL Server 的"全文搜索"功能;但结果可能仍然很差。请参阅 http://www.sql-server-performance.com/2010/full-text-search-2008/。
我建议使用像Apache Lucene这样的搜索索引器(在 Lucene.NET 中可用作dll)。另一种选择是编写自己的 Windows 服务来索引所有记录。