PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Entity Framework core - Contient est sensible à la casse ou insensible à la casse ?

C'était le cas pour les anciennes versions du noyau EF. Maintenant string.Contains est sensible à la casse, et par exemple pour sqlite, il correspond à la fonction sqlite `instr()' (je ne sais pas pour postgresql).

Si vous voulez comparer des chaînes sans tenir compte de la casse, vous avez DbFunctions pour faire le travail.

context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();

MISE À JOUR à @Gert :

Une partie de l'hypothèse dans la question est incorrecte. string.Contains ne se convertit PAS en une LIKE expression même si c'était le cas dans les versions ef core <=1.0 (je pense).

  • Dans SQLServer string.contains convertit en CHARINDEX() , dans oracle et sqlite dans instr() qui sont sensibles à la casse par défaut SAUF si le classement de la base de données ou de la colonne est défini autrement (encore une fois, je ne sais pas pour postgresql).
  • Dans tous les cas EF.Functions.Like() convertit en SQL LIKE expression qui est insensible à la casse par défaut, sauf si le classement de la base de données ou de la colonne est défini autrement.

Alors oui, tout se résume à la collation mais - corrigez-moi si je me trompe - d'une certaine manière, le code peut avoir une influence sur la recherche sensible à la casse/insensible en fonction de la méthode ci-dessus que vous utilisez.

Maintenant, je ne suis peut-être pas complètement à jour, mais je ne pense pas que les migrations de base EF traitent naturellement du classement DB et à moins que vous n'ayez déjà créé la table manuellement, vous vous retrouverez avec le classement par défaut (sensible à la casse pour sqlite et I Honnêtement, je ne sais pas pour les autres).

Pour en revenir à la question d'origine, vous avez au moins 2 options pour effectuer cette recherche insensible à la casse, sinon 3 dans une future version :

  1. Spécifiez le classement des colonnes lors de la création à l'aide de DbContext.OnModelCreating() en utilisant cette astuce
  2. Remplacez votre string.Contains par EF.Functions.Like()
  3. Ou attendez une fonctionnalité prometteuse encore en discussion :EF.Functions.Collate() fonction