199 votes

LINQ contient insensible à la casse

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));
}
 

261voto

Nealv Points 3058
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())

133voto

Sjoerd Points 34671

Si la requête LINQ est exécutée dans le contexte de base de données, un appel à l' Contains() est mappé à l' LIKE opérateur:

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

Si la requête LINQ est exécutée .NET, vous pouvez utiliser IndexOf(), mais cette méthode n'est pas pris 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 server gère les cultures le même que .NET. Ce n'est pas tout à fait vrai, car il n' soutien StartsWith(string, StringComparison).

Cependant, il ne semble pas à l'appui d'une méthode qui évalue LIKE dans LINQ to SQL, et à une comparaison de la casse .NET, rendant impossible d'ignorer la casse Contient() de manière systématique.

90voto

Jeff Mercado Points 42075

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

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

14voto

Marko Points 2571

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

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

2voto

E Rolnicki Points 968
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
    return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X