LINQ contient des étiquettes insensibles à la casse

Ce code est sensible à la casse, comment le rendre insensible à la casse?

public IQueryable GetFacilityItemRootByDescription(ssortingng description) { return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description)); } 

 fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower()) 

Si la requête LINQ est exécutée dans un contexte de firebase database, un appel à Contains() est associé à l’opérateur LIKE :

.Where(a => a.Field.Contains("hello")) devient Field LIKE '%hello%' . L’opérateur LIKE est insensible à la casse par défaut, mais cela peut être modifié en modifiant le classement de la colonne .

Si la requête LINQ est exécutée dans un contexte .NET, vous pouvez utiliser IndexOf () , mais cette méthode n’est pas prise en charge dans LINQ to SQL.

LINQ to SQL ne prend pas en charge les méthodes qui utilisent un paramètre CultureInfo, probablement parce qu’il ne peut pas garantir que le serveur SQL gère les cultures de la même manière que .NET. Ce n’est pas tout à fait vrai car il supporte StartsWith(ssortingng, SsortingngComparison) .

Cependant, il ne semble pas prendre en charge une méthode qui évalue LIKE dans LINQ to SQL, et une comparaison insensible à la casse dans .NET, rendant impossible la réalisation de Contains () insensibles à la casse.

En supposant que nous travaillions avec des chaînes ici, voici une autre solution “élégante” utilisant IndexOf() .

 public IQueryable GetFacilityItemRootByDescription(ssortingng description) { return this.ObjectContext.FACILITY_ITEM .Where(fi => fi.DESCRIPTION .IndexOf(description, SsortingngComparison.OrdinalIgnoreCase) != -1); } 

La réponse acceptée ici ne mentionne pas le fait que si vous avez une chaîne nulle, ToLower () lancera une exception. Le moyen le plus sûr serait de faire:

 fi => (fi.DESCRIPTION ?? ssortingng.Empty).ToLower().Contains((description ?? ssortingng.Empty).ToLower()) 

En utilisant C # 6.0 (qui permet l’expression des fonctions et la propagation nulle), pour LINQ to Objects, cela peut se faire en une seule ligne comme celle-ci (en recherchant également null):

 public static bool ContainsInsensitive(this ssortingng str, ssortingng value) => str?.IndexOf(value, SsortingngComparison.OrdinalIgnoreCase) >= 0; 

Vous pouvez utiliser ssortingng.Compare

  lst.Where(x => ssortingng.Compare(x,"valueToCompare",SsortingngComparison.InvariantCultureIgnoreCase)==0); 

si vous voulez juste vérifier contient alors utilisez “Any”

  lst.Any(x => ssortingng.Compare(x,"valueToCompare",SsortingngComparison.InvariantCultureIgnoreCase)==0) 

IndexOf fonctionne mieux dans ce cas

 return this .ObjectContext .FACILITY_ITEM .Where(fi => fi.DESCRIPTION.IndexOf(description, SsortingngComparison.OrdinalIgnoreCase)>=0); 
 public static bool Contains(this ssortingng input, ssortingng findMe, SsortingngComparison comparisonType) { return Ssortingng.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1; } 

Utilisez la méthode Enumerable.Contains (IEnumerable, TSource, IEqualityComparer) en utilisant l’un des comparateurs SsortingngComparer .___ IgnoreCase (Einal Ordinal, InvariantCulture ou CurrentCulture).

 public IQueryable GetFacilityItemRootByDescription(ssortingng description) { return this.ObjectContext.FACILITY_ITEM.Where( fi => fi.DESCRIPTION.Contains(description, SsortingngComparer.OrdinalIgnoreCase) ); } 

Utilisez la méthode Ssortingng.Equals

 public IQueryable GetFacilityItemRootByDescription(ssortingng description) { return this.ObjectContext.FACILITY_ITEM .Where(fi => fi.DESCRIPTION .Equals(description, SsortingngComparison.OrdinalIgnoreCase)); }