1

我正在尝试优化执行大约需要 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#。

4

1 回答 1

0

我不会为此搜索查询使用 SQL 查询/Linq 查询。文本搜索的普通查询可能会很慢,并且只返回准确的结果;他们不纠正拼写/语法错误等。

您可以考虑使用 SQL Server 的“全文搜索”功能;但由此产生的性能可能仍然很差。请参考http://www.sql-server-performance.com/2010/full-text-search-2008/

我建议使用像 Apache Lucene 这样的搜索索引器(在 Lucene.NET 中作为 dll 提供)。另一种选择是编写自己的 Windows 服务来索引所有记录。

于 2012-08-07T13:39:21.840 回答