Non utilizzare mai .ToLower()
per eseguire un confronto senza distinzione tra maiuscole e minuscole. Ecco perché:
- Probabilmente è sbagliato (il confronto del tuo cliente potrebbe essere, ad esempio, turco e il confronto del database no).
- È altamente inefficiente; l'SQL emesso è
LOWER
invece di=
con regole di confronto senza distinzione tra maiuscole e minuscole.
Invece, usa StringComparison.OrdinalIgnoreCase
o StringComparison.CurrentCultureIgnoreCase
:
var q = from f in Context.Foos
where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
select f;
Ma per Contains()
c'è un problema:a differenza di Equals
, StartsWith
, ecc., non ha un sovraccarico per un StringComparison
discussione. Come mai? Buona domanda; chiedi a Microsoft.
Questo, combinato con la limitazione di SQL Server su LOWER
significa che non c'è un modo semplice per fare quello che vuoi.
Possibili soluzioni alternative potrebbero includere:
- Utilizzare un indice di testo completo ed eseguire la ricerca in una procedura.
- Usa
Equals
oStartsWith
invece, se possibile per il tuo compito - Cambiare le regole di confronto predefinite della colonna?