Това беше така за по-старите версии на EF ядрото. Сега string.Contains
е чувствителен към малки и големи букви и например за sqlite се преобразува във функцията на sqlite `instr()' (не знам за postgresql).
Ако искате да сравнявате низове по начин, който не е чувствителен към главни букви, имате DbFunctions, които да вършат работата.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
АКТУАЛИЗИРАНЕ до @Gert:
Част от предположението във въпроса е неправилно. string.Contains
НЕ се преобразува в LIKE expression
въпреки че беше така в основните версии на ef <=1.0 (мисля).
- В SQLServer
string.contains
преобразува вCHARINDEX()
, в oracle и sqlite вinstr()
които са чувствителни към главните букви по подразбиране, ОСВЕН АКО db или колона за сравнение не е дефинирана по друг начин (Отново, не знам за postgresql). - Във всички случаи
EF.Functions.Like()
преобразува в SQLLIKE
израз, който по подразбиране не е чувствителен към малки и големи букви, освен ако съпоставянето на db или колони не е дефинирано по друг начин.
Така че, да, всичко се свежда до съпоставяне, но – поправете ме, ако греша – по някакъв начин кодът може да окаже влияние върху търсенето, което е чувствително/нечувствително в зависимост от това кой от горните методи използвате.
Сега може да не съм напълно актуален, но не мисля, че миграциите на ядрото на EF се справят естествено със съпоставянето на DB и освен ако вече не сте създали таблицата ръчно, в крайна сметка ще получите съпоставянето по подразбиране (чувствително малки и големи букви за sqlite и аз честно казано не знам за другите).
Връщайки се към оригиналния въпрос, имате поне 2 опции за извършване на това търсене, независимо от главните букви, ако не и 3 в бъдеща версия:
- Посочете съпоставянето на колони при създаване с помощта на DbContext.OnModelCreating(), като използвате този трик
- Заменете вашия
string.Contains
отEF.Functions.Like()
- Или изчакайте обещаваща функция, която все още се обсъжда:
EF.Functions.Collate()
функция