sql >> Base de Datos >  >> RDS >> Sqlserver

Linq to Entities:usando ToLower() en campos NText

Nunca use .ToLower() para realizar una comparación sin distinción entre mayúsculas y minúsculas. He aquí por qué:

  1. 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).
  2. 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 o StartsWith en cambio, si es posible para su tarea
  • ¿Cambiar la intercalación predeterminada de la columna?