У меня есть приложение для Windows, написанное на C #, которому необходимо загрузить 250 000 строк из базы данных и предоставить функцию «поиск по мере ввода», что означает, что как только пользователь вводит что-то в тексте Приложению необходимо выполнить поиск во всех 250 000 записей (которые, кстати, представляют собой один столбец с 1000 символами в каждой строке), используя поиск , например
, и отобразить найденные записи.
Я использовал следующий подход:
1- Приложение загружает все записи в типизированный List
while (objSQLReader.Read())
{
lstEmployees.Add(new EmployeesData(
Convert.ToInt32(objSQLReader.GetString(0)),
objSQLReader.GetString(1),
objSQLReader.GetString(2)));
}
2- В событии TextChanged, используя LINQ
, я выполняю поиск (с комбинацией регулярных выражений) и присоедините IEnumerable
к 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 для отображения элемента.
e.Item = new ListViewItem(new String[] {
lstFoundEmployees.ElementAt(e.ItemIndex).DateProjectTaskClient,
e.ItemIndex.ToString() });
Хотя lstEmployees
загружается относительно быстро (1,5 секунды) для загрузки списка из SQL Server, для поиска по TextChanged требуется более 7 минут для поиска с использованием LINQ. Поиск через SQL Server напрямую путем выполнения поиска LIKE
занимает менее 7 секунд.
Что я здесь делаю не так? Как сделать этот поиск быстрее (не более 2 секунд)? Это требование моего клиента. Так что любая помощь приветствуется. Пожалуйста помоги...