Tengo una aplicación de Windows escrita en C# que necesita cargar 250,000 filas desde la base de datos y proporciona una función de "buscar mientras escribe" lo que significa que el usuario escribe algo en un texto cuadro, la aplicación necesita buscar los 250,000 registros (que son, por cierto, una sola columna con 1000 caracteres en cada fila) usando like
buscar y mostrar los registros encontrados.manera más rápida para buscar una gran lista de textos grandes
El enfoque que siguió fue:
1- Las cargas de aplicación todos los registros en un escrito List<EmployeeData>
while (objSQLReader.Read())
{
lstEmployees.Add(new EmployeesData(
Convert.ToInt32(objSQLReader.GetString(0)),
objSQLReader.GetString(1),
objSQLReader.GetString(2)));
}
2- En caso TextChanged, Uso de LINQ
, busco (con combinación de expresiones regulares) y conecte el IEnumerable<EmployeesData>
a un ListView que está en modo virtual.
String strPattern = "(?=.*wood*)(?=.*james*)";
IEnumerable<EmployeesData> lstFoundItems = from objEmployee in lstEmployees
where Regex.IsMatch(Employee.SearchStr, strPattern, RegexOptions.IgnoreCase)
select objEmployee;
lstFoundEmployees = lstFoundItems;
3- El evento RetrieveVirtualItem se maneja para mostrar elementos en ListView para mostrar el elemento.
e.Item = new ListViewItem(new String[] {
lstFoundEmployees.ElementAt(e.ItemIndex).DateProjectTaskClient,
e.ItemIndex.ToString() });
Aunque el lstEmployees
se carga relativamente rápido (1,5 segundos) para cargar la lista de SQL Server, buscar en TextChanged, se tarda más de 7 minutos para buscar usando LINQ. La búsqueda a través del servidor SQL directamente realizando una búsqueda LIKE
lleva menos de 7 segundos.
¿Qué estoy haciendo mal aquí? ¿Cómo puedo hacer esta búsqueda más rápido (no más de 2 segundos)? Este es un requisito de mi cliente. Entonces, cualquier ayuda es muy apreciada. Por favor, ayuda ...
@RamiShareef, mantengo que esta pregunta se trata de expresiones regulares, (más que nada en realidad), así que por favor no elimine la etiqueta de expresiones regulares. –
¿Lo necesita como un cuadro de texto de autocompletar? – JayOnDotNet
Sí, como un cuadro de texto Autocompletar, pero los resultados se deben mostrar en un cuadro de lista o vista de lista por separado ... – user1130862