LINQ Where Ignore Accentuation et Case

Quel est le moyen le plus simple de filtrer des éléments avec LINQ via la méthode Where ignorant les majuscules et les majuscules?

Jusqu’à présent, j’ai pu ignorer Casing en appelant des méthodes sur les propriétés, ce qui, à mon avis, n’est pas une bonne idée, car elle appelle la même méthode pour chaque élément (non?).

Alors voici ce que j’ai eu jusqu’à présent:

 var result = from p in People where p.Name.ToUpper().Contains(filter.ToUpper()) select p; 

S’il vous plaît, dites-moi s’il s’agit d’une bonne pratique et de la manière la plus simple d’ignorer l’accentuation.

Pour ignorer les majuscules et les accents (signes diacritiques), vous pouvez d’abord définir une méthode d’extension comme celle-ci:

  public static ssortingng RemoveDiacritics(this Ssortingng s) { Ssortingng normalizedSsortingng = s.Normalize(NormalizationForm.FormD); SsortingngBuilder ssortingngBuilder = new SsortingngBuilder(); for (int i = 0; i < normalizedString.Length; i++) { Char c = normalizedString[i]; if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) stringBuilder.Append(c); } return stringBuilder.ToString(); } 

(Modifié en ignorant les lettres accentuées dans la comparaison de chaînes )

Maintenant, vous pouvez exécuter votre requête:

 ssortingng queryText = filter.ToUpper().RemoveDiacritics(); var result = from p in People where p.Name.ToUpper().RemoveDiacritics() == queryText select p; 

Cela convient si vous parcourez simplement une collection en C #, mais si vous utilisez LINQ to SQL, il est préférable d'éviter les méthodes non standard (y compris les méthodes d'extension) dans votre requête LINQ. En effet, votre code ne peut pas être converti en SQL valide et donc s'exécuter sur SQL Server avec toutes ses optimisations de performances.

Comme il ne semble pas y avoir de méthode standard pour ignorer les accents dans LINQ to SQL, dans ce cas, je suggérerais de changer le type de champ que vous souhaitez rechercher pour qu'il soit insensible à la casse et à l'accent (CI_AI).

Avec votre exemple:

 ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI 

Votre requête doit maintenant ignorer l’accentuation et la casse.

Notez que vous devrez supprimer temporairement toute contrainte unique sur le champ avant d' exécuter la requête ci-dessus, par exemple

 ALTER TABLE People DROP CONSTRAINT UQ_People_Name 

Maintenant, votre requête LINQ serait simplement:

 var result = from p in People where p.Name == filter select p; 

Voir la question connexe ici .

Changer assembler:

 ALTER TABLE dbo.MyTable ALTER COLUMN CharCol varchar(10)**COLLATE Latin1_General_CI_AS** NOT NULL; 

Voici un code qui permet la comparaison en ignorant l’accentuation:

Ignorer les lettres accentuées dans la comparaison de chaînes

J’aurai la décence de ne pas copier le code, afin que l’auteur puisse obtenir un représentant pour sa réponse. Maintenant, répondez à votre question:

Vous obtiendriez ce morceau de code et l’utiliseriez comme ceci:

 var result = from p in People where p.Name.ToUpper().Contains(RemoveDiacritics(filter.ToUpper())) select p; 

Vous transformez même ce code en une méthode d’extension. J’ai 🙂

Suite à la solution de Dunc consistant à modifier le classement de toute la firebase database, voici un didacticiel complet traitant des index, des clés, etc.:

https://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

(Assurez-vous de lire tous les commentaires en premier.)