Entité Framework LINQ ne contient pas de majuscules / minuscules

Je rencontre des problèmes avec Entity Framework et je n'arrive pas à find de solution.

Ce que je veux faire est de comparer les strings pour une fonction de search que je cours sur le server. C'est essentiellement: collection.Where(c => c.Name.Contains(searchTerm)); où searchTerm est une string passée par l'user.

Partout où je regarde c'est soit:

  1. Changez les deux strings avec toUpper (), ou

  2. Définissez la collation sur une case insensible à la casse.

Cependant, aucun d'entre eux ne s'applique à mon cas. Voici une question similaire qui n'a pas de réponse: Entity Framework – case insensitive Contient?

Utiliser la première alternative résulterait en get chaque ligne dans la database, puis exécuter toUpper (), pour voir si c'est une correspondance. Ceci est inacceptable au niveau des performances.

La deuxième approche semble plus susceptible d'être une solution valable, mais ne fonctionne pas pour une raison quelconque. J'ai deux bases de données. Un local et un distant. La database MSSQL distante est définie sur collation: Finnish_Swedish_CI_AS, ce qui signifie qu'elle est insensible à la casse? La database locale est une database locale générée automatiquement avec la propriété "Case Sensitive" définie sur False.

Peu importe laquelle de ces deux bases de données j'utilise c'est toujours sensible à la casse pour les users.

Quelqu'un peut-il expliquer pourquoi cela se passe afin que je puisse continuer ma vie misérable?

Cordialement, Robin Dorbell

    D'après les commentaires, il semble que l'OP jette d'abord la list IQueryable à une ICollection, ce qui signifie que tout LINQ ultérieur s'exécute "localement" au lieu d'avoir la chance d'être converti en SQL.

    Par exemple,

      // Should be IQueryable<T> ICollection<User> users = context.Users; // This is executed in code rather than SQL, and so is case SENSITIVE users = users.Where(c => c.Name.Contains(searchTerm)); 

    Cela a peut-être aidé à déboguer le problème: Comment afficher le SQL généré par le framework d'entité?

    Cela n'a jamais été sensible à la casse pour moi, mais je suppose que c'est exactement comme cela que j'ai configuré ma database. Vous pouvez certainement utiliser votre première option de les convertir en majuscules, EF ne les met pas en memory pour le faire, informe juste le server SQL pour le faire. Par exemple:

     ssortingng searchTerm = "Some Text"; dbcontext.Table.Where (t => t.Column.ToLower().Contains(searchTerm.ToLower())); 

    Produit le SQL suivant (ish, j'ai fait ceci avec linqtosql mais EF devrait être assez semblable):

     -- Region Parameters DECLARE @p0 NVarChar(1000) = '%some text%' -- EndRegion SELECT * FROM [Table] AS [t0] WHERE LOWER([t0].[Column]) LIKE @p0 

    Utilisez ssortingng.Equals

     collection.Where(c => ssortingng.Equals(c.Name, searchTerm, SsortingngComparison.CurrentCultureIgnoreCase)); 

    En outre, vous n'avez pas à vous soucier de null et ne récupérer que les informations que vous voulez.

    Utilisez SsortingngComparision.CurrentCulture pour Case Sensitive.

     collection.Where(c => ssortingng.Equals(c.Name, searchTerm, SsortingngComparison.CurrentCulture));