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
LOWER
en 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
Equals
oStartsWith
en cambio, si es posible para su tarea - ¿Cambiar la intercalación predeterminada de la columna?