Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Linq to Entities:usando ToLower() sui campi NText

Non utilizzare mai .ToLower() per eseguire un confronto senza distinzione tra maiuscole e minuscole. Ecco perché:

  1. Probabilmente è sbagliato (il confronto del tuo cliente potrebbe essere, ad esempio, turco e il confronto del database no).
  2. È 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 o StartsWith invece, se possibile per il tuo compito
  • Cambiare le regole di confronto predefinite della colonna?