Nunca use .ToLower() para realizar una comparación sin distinción entre mayúsculas y minúsculas. He aquí por qué:
- Es posible que sea incorrecto (la intercalación de su cliente podría ser, por ejemplo, turca, y la intercalación de su base de datos no).
- Es altamente ineficiente; el SQL emitido es
LOWERen lugar de=con una intercalación que no distingue entre mayúsculas y minúsculas.
En su lugar, use StringComparison.OrdinalIgnoreCase o StringComparison.CurrentCultureIgnoreCase :
var q = from f in Context.Foos
where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
select f;
Pero para Contains() hay un problema:A diferencia de Equals , StartsWith , etc., no tiene una sobrecarga para un StringComparison argumento. ¿Por qué? Buena pregunta; pregunta a Microsoft.
Eso, combinado con la limitación de SQL Server en LOWER significa que no hay una manera simple de hacer lo que quieres.
Las posibles soluciones pueden incluir:
- Utilice un índice de texto completo y realice la búsqueda en un procedimiento.
- Usar
EqualsoStartsWithen cambio, si es posible para su tarea - ¿Cambiar la intercalación predeterminada de la columna?