Kiedyś tak było w przypadku starszych wersji rdzenia EF. Teraz string.Contains
rozróżnia wielkość liter i na przykład dla sqlite mapuje do funkcji sqlite `instr()' (nie znam postgresql).
Jeśli chcesz porównywać ciągi znaków bez uwzględniania wielkości liter, masz DbFunctions do wykonania zadań.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
AKTUALIZUJ @Gert:
Część założenia w pytaniu jest błędna. string.Contains
NIE konwertuje na LIKE expression
chociaż KIEDYŚ tak było w wersjach ef core <=1.0 (chyba).
- W SQLServer
string.contains
konwertuje naCHARINDEX()
, w Oracle i sqlite winstr()
które domyślnie rozróżniają wielkość liter, CHYBA że sortowanie db lub kolumn jest zdefiniowane inaczej (znowu nie znam postgresql). - We wszystkich przypadkach
EF.Functions.Like()
konwertuje na SQLLIKE
wyrażenie, w którym domyślnie nie jest rozróżniana wielkość liter, chyba że db lub sortowanie kolumn jest zdefiniowane inaczej.
Więc tak, wszystko sprowadza się do sortowania, ale - popraw mnie, jeśli się mylę - w pewnym sensie kod może mieć wpływ na wyszukiwanie z uwzględnieniem wielkości liter/niewrażliwości w zależności od tego, której z powyższych metod użyjesz.
Teraz może nie jestem całkowicie na bieżąco, ale nie sądzę, aby migracje rdzenia EF w naturalny sposób zajmowały się sortowaniem DB i chyba że wcześniej utworzyłeś tabelę ręcznie, skończysz z domyślnym sortowaniem (rozróżniana jest wielkość liter dla sqlite i ja szczerze nie wiem dla innych).
Wracając do pierwotnego pytania, masz co najmniej 2 opcje do przeprowadzenia wyszukiwania bez rozróżniania wielkości liter, jeśli nie 3 w przyszłej wersji :
- Określ sortowanie kolumn podczas tworzenia za pomocą DbContext.OnModelCreating() za pomocą tej sztuczki
- Zastąp swój
string.Contains
przezEF.Functions.Like()
- Lub poczekaj na obiecującą funkcję, która wciąż jest przedmiotem dyskusji:
EF.Functions.Collate()
funkcja