Ne jamais utiliser .ToLower()
pour effectuer une comparaison insensible à la casse. Voici pourquoi :
- C'est peut-être faux (votre classement client pourrait être, par exemple, turc, et votre classement DB non).
- C'est très inefficace; le SQL émis est
LOWER
au lieu de=
avec un classement insensible à la casse.
Utilisez plutôt StringComparison.OrdinalIgnoreCase
ou StringComparison.CurrentCultureIgnoreCase
:
var q = from f in Context.Foos
where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
select f;
Mais pour Contains()
il y a un problème :contrairement à Equals
, StartsWith
, etc., il n'y a pas de surcharge pour un StringComparison
dispute. Pourquoi? Bonne question; demandez à Microsoft.
Cela, combiné avec la limitation de SQL Server sur LOWER
signifie qu'il n'y a pas de moyen simple de faire ce que vous voulez.
Les solutions de contournement possibles peuvent inclure :
- Utilisez un index de texte intégral et effectuez la recherche dans une procédure.
- Utilisez
Equals
ouStartsWith
à la place, si possible pour votre tâche - Modifier le classement par défaut de la colonne ?