Me preguntaba cuáles eran las mejores prácticas para hacer una consulta en sql con un valor dinámico, digamos que tengo un Valor (nvarchar (máximo))
valor: "912345678"
select * from AllData where Number like '%912345678%'valor: "Miguel"
select * from AllData where Name like '%Michael%'valor: "Calle número 10"
select * from AllData where Address like '%Street number 10%'Estos enfoques son un poco lentos ya que buscar un número que tiene 9 dígitos sería más rápido sin % como este
select * from AllData where Number like '912345678'Uso un EDMX para hacer una conexión a una base de datos externa en C#, así:
var Result = EDMXEntity.Entities.Where(x => (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) || (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0) || (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList();¿Cómo puedo aumentar el rendimiento?
Las búsquedas con comodines como estas en los campos varchar / nvarchar van a iterar sobre cada carácter, más o menos, en busca de registros que cumplan con los criterios.
Una excelente (¡y rápida!) opción para este tipo de búsquedas es:
CONTAINS cuando busque en lugar de comodines.Usted mencionó buscar fuentes creíbles, aquí hay una buena lectura.
Si usar LIKE y PATINDEX no le dio el rendimiento necesario, entonces probablemente debería escribir sp que usará FTS.
Para buscar con 'me gusta' en EF, puede usar Containers() :
var Result = EDMXEntity.Entities.Where( x => x.Name.Contains(Value) || x => x.Number.ToString().Contains(Value) || x => x.Address.Contains(Value)).Take(50).ToList();Pero con este tipo de búsqueda nunca lograrás un buen rendimiento. Debe cambiar la forma en que busca o almacena los datos en la base de datos. Por ejemplo, si está seguro de que el usuario estaba buscando el nombre, puede buscar solo en la columna 'nombre'.