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 enCHARINDEX()
, dans oracle et sqlite dansinstr()
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 SQLLIKE
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 :
- Spécifiez le classement des colonnes lors de la création à l'aide de DbContext.OnModelCreating() en utilisant cette astuce
- Remplacez votre
string.Contains
parEF.Functions.Like()
- Ou attendez une fonctionnalité prometteuse encore en discussion :
EF.Functions.Collate()
fonction