PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Nucleo di Entity Framework - Contiene la distinzione tra maiuscole e minuscole o senza distinzione tra maiuscole e minuscole?

Era il caso delle versioni precedenti di EF core. Ora string.Contains fa distinzione tra maiuscole e minuscole e, ad esempio, per sqlite si associa alla funzione sqlite `instr()' (non so per postgresql).

Se vuoi confrontare le stringhe senza distinzione tra maiuscole e minuscole, hai DbFunctions per fare il lavoro.

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

AGGIORNA a @Gert:

Una parte dell'ipotesi nella domanda è errata. string.Contains NON si converte in un LIKE expression anche se era il caso delle versioni ef core <=1.0 (credo).

  • In SQLServer string.contains converte in CHARINDEX() , in Oracle e sqlite in instr() che fanno distinzione tra maiuscole e minuscole per impostazione predefinita A MENO CHE le regole di confronto db o colonne non siano definite diversamente (Anche in questo caso, non lo so per postgresql).
  • In tutti i casi EF.Functions.Like() converte in un SQL LIKE espressione che non fa distinzione tra maiuscole e minuscole per impostazione predefinita, a meno che le regole di confronto db o colonne non siano definite diversamente.

Quindi sì, tutto si riduce alle regole di confronto ma - correggimi se sbaglio - in un certo senso il codice può avere un'influenza sulla ricerca con distinzione tra maiuscole e minuscole/non sensibile a seconda di quale dei metodi precedenti utilizzi.

Ora, potrei non essere completamente aggiornato, ma non credo che le migrazioni di base EF gestiscano le regole di confronto DB in modo naturale e, a meno che tu non abbia già creato la tabella manualmente, ti ritroverai con le regole di confronto predefinite (con distinzione tra maiuscole e minuscole per sqlite e I sinceramente non so per gli altri).

Tornando alla domanda originale, hai almeno 2 opzioni per eseguire questa ricerca senza distinzione tra maiuscole e minuscole se non 3 in una versione futura:

  1. Specifica le regole di confronto delle colonne durante la creazione utilizzando DbContext.OnModelCreating() usando questo trucco
  2. Sostituisci il tuo string.Contains di EF.Functions.Like()
  3. Oppure aspetta una funzione promettente ancora in discussione:EF.Functions.Collate() funzione