PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Núcleo do Entity Framework - Contém diferencia maiúsculas de minúsculas ou não diferencia maiúsculas de minúsculas?


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 em CHARINDEX() , em oracle e sqlite em instr() 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 SQL LIKE 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:
  1. Especifique o agrupamento de colunas na criação usando DbContext.OnModelCreating() usando este truque
  2. Substitua sua string.Contains por EF.Functions.Like()
  3. Ou espere por um recurso promissor ainda em discussão:EF.Functions.Collate() função