【发布时间】:2012-02-03 20:59:15
【问题描述】:
我有一个用 C# 编写的 Windows 应用程序,它需要从数据库加载 250,000 行并提供“键入时搜索”功能,这意味着一旦用户在文本框中键入内容,应用程序就需要搜索所有 250,000记录(顺便说一句,单列,每行 1000 个字符)使用like 搜索并显示找到的记录。
我遵循的方法是:
1- 应用程序将所有记录加载到键入的List<EmployeeData>
while (objSQLReader.Read())
{
lstEmployees.Add(new EmployeesData(
Convert.ToInt32(objSQLReader.GetString(0)),
objSQLReader.GetString(1),
objSQLReader.GetString(2)));
}
2- 在 TextChanged 事件中,使用 LINQ,我搜索(结合正则表达式)并将 IEnumerable<EmployeesData> 附加到处于虚拟模式的 ListView。
String strPattern = "(?=.*wood*)(?=.*james*)";
IEnumerable<EmployeesData> lstFoundItems = from objEmployee in lstEmployees
where Regex.IsMatch(Employee.SearchStr, strPattern, RegexOptions.IgnoreCase)
select objEmployee;
lstFoundEmployees = lstFoundItems;
3- 处理RetrieveVirtualItem事件,在ListView中显示item来显示item。
e.Item = new ListViewItem(new String[] {
lstFoundEmployees.ElementAt(e.ItemIndex).DateProjectTaskClient,
e.ItemIndex.ToString() });
虽然lstEmployees 从 SQL Server 加载列表的加载速度相对较快(1.5 秒),但要在 TextChanged 上进行搜索,使用 LINQ 进行搜索需要 7 分钟以上。通过执行LIKE 搜索直接通过 SQL Server 进行搜索只需不到 7 秒。
我在这里做错了什么?我怎样才能使这个搜索更快(不超过 2 秒)?这是我客户的要求。因此,非常感谢任何帮助。请帮忙...
【问题讨论】:
-
@RamiShareef,我坚持认为这个问题是关于正则表达式的,(实际上比其他任何事情都重要)所以请不要删除正则表达式标签。
-
你需要它像一个自动完成文本框吗?
-
是的......就像一个自动完成文本框,但结果应该单独显示在列表框或列表视图中......