Ce code est sensible à la casse, comment le rendre insensible à la casse?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Réponses:
En supposant que nous travaillons avec des chaînes ici, voici une autre solution "élégante" utilisant
IndexOf()
.la source
la source
IEqualityComparer<string>
attribut pour gérer le fonctionnement de la comparaison. Utiliser ToLower et ToUpper pour vérifier l'égalité est une mauvaise idée. Essayez:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
par exempleError 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
withStringComparer
ne reçoit pas de chaîne comme paramètre, ce sera donc une erreur de construction.IndexOf
surQueryable
ne peut probablement pas être traduit en SQL. Personnellement, j'ai trouvé cette réponse tout à fait valable car nous parlons de LINQ to database.Si la requête LINQ est exécutée dans le contexte de la base de données, un appel à
Contains()
est mappé à l'LIKE
opérateur:.Where(a => a.Field.Contains("hello"))
devientField LIKE '%hello%'
. L'LIKE
opérateur 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 prennent un CultureInfo comme paramètre, 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 prend en charge
StartsWith(string, StringComparison)
.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, ce qui rend impossible de faire Contains () insensible à la casse de manière cohérente.la source
insensitive
recherche de cas , et dans l'autre, j'en ai besoincase sensitive
. Dois-je juste prendre le coup de performance et utiliser «toLower ()»?La réponse acceptée ici ne mentionne pas le fait que si vous avez une chaîne nulle, ToLower () lèvera une exception. La manière la plus sûre serait de faire:
la source
En utilisant C # 6.0 (qui autorise les fonctions de corps d'expression et la propagation nulle), pour LINQ to Objects, cela peut être fait en une seule ligne comme celle-ci (en vérifiant également la valeur null):
la source
IndexOf fonctionne mieux dans ce cas
la source
Vous pouvez utiliser une chaîne.
si vous voulez juste vérifier contient, utilisez "Any"
la source
la source
la source
Honnêtement, cela n'a pas besoin d'être difficile. Cela peut sembler au début, mais ce n'est pas le cas. Voici une simple requête linq en C # qui fait exactement comme demandé.
Dans mon exemple, je travaille sur une liste de personnes qui ont une propriété appelée FirstName.
Cela recherchera dans la base de données une recherche en minuscules mais retournera des résultats complets.
la source
Utilisez la méthode String.Equals
la source