Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Linq to Entities :utilisation de ToLower() sur les champs NText

Ne jamais utiliser .ToLower() pour effectuer une comparaison insensible à la casse. Voici pourquoi :

  1. C'est peut-être faux (votre classement client pourrait être, par exemple, turc, et votre classement DB non).
  2. 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 ou StartsWith à la place, si possible pour votre tâche
  • Modifier le classement par défaut de la colonne ?