Costumava ser o caso de versões mais antigas do EF core. Agora
string.Contains
é sensível a maiúsculas e minúsculas e, por exemplo, para sqlite, mapeia para a função sqlite `instr()' (não sei para postgresql). Se você quiser comparar strings sem diferenciar maiúsculas de minúsculas, terá DbFunctions para fazer os trabalhos.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
ATUALIZAÇÃO para @Gert:
Uma parte da suposição na pergunta está incorreta.
string.Contains
NÃO converte em uma LIKE expression
mesmo que costumava ser o caso nas versões principais do ef <=1.0 (eu acho). - No SQLServer
string.contains
converte emCHARINDEX()
, em oracle e sqlite eminstr()
que diferenciam maiúsculas de minúsculas por padrão, A MENOS QUE db ou collation de colunas sejam definidos de outra forma (novamente, não sei para postgresql). - Em todos os casos
EF.Functions.Like()
converte em um SQLLIKE
expressão que não diferencia maiúsculas de minúsculas por padrão, a menos que o agrupamento de banco de dados ou coluna seja definido de outra forma.
Então, sim, tudo se resume ao agrupamento, mas - corrija-me se estiver errado - de certa forma, o código pode influenciar a pesquisa com distinção entre maiúsculas e minúsculas, dependendo de qual dos métodos acima você usa.
Agora, eu posso não estar completamente atualizado, mas não acho que as migrações do EF core lidem com o agrupamento de banco de dados naturalmente e, a menos que você já tenha criado a tabela manualmente, você terminará com o agrupamento padrão (diferencia maiúsculas de minúsculas para sqlite e I honestamente não sei para os outros).
Voltando à pergunta original, você tem pelo menos 2 opções para realizar essa pesquisa que não diferencia maiúsculas de minúsculas, se não 3 em uma versão futura:
- Especifique o agrupamento de colunas na criação usando DbContext.OnModelCreating() usando este truque
- Substitua sua
string.Contains
porEF.Functions.Like()
- Ou espere por um recurso promissor ainda em discussão:
EF.Functions.Collate()
função