我正在尝试优化执行大约需要 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 字段上执行 Contains。由于过滤器数组,无法预编译查询。
如何优化此功能?我听说过诸如 Sql Server 上的 FullTextSearch 或存储过程之类的东西。那能帮上忙吗?
我们正在使用 Sql Server 2008、Entity Framework 4.0(模型优先)和 C#。