Dříve tomu tak bylo u starších verzí jádra EF. Nyní string.Contains
rozlišuje velká a malá písmena a například pro sqlite se mapuje na funkci sqlite `instr()' (nevím pro postgresql).
Pokud chcete porovnávat řetězce způsobem bez rozlišení velkých a malých písmen, máte k dispozici DbFunctions.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
AKTUALIZACE na @Gert:
Část předpokladu v otázce je nesprávná. string.Contains
NEkonvertuje na LIKE expression
i když to BYLO v případě ef core verzí <=1.0 (myslím).
- V SQLServeru
string.contains
převede naCHARINDEX()
, v oracle a sqlite doinstr()
které ve výchozím nastavení rozlišují velká a malá písmena, POKUD není řazení db nebo sloupců definováno jinak (Opět nevím pro postgresql). - Ve všech případech
EF.Functions.Like()
převede na SQLLIKE
výraz, který ve výchozím nastavení nerozlišuje velká a malá písmena, pokud není řazení db nebo sloupců definováno jinak.
Takže ano, všechno jde až na řazení, ale - opravte mě, pokud se mýlím - kód může svým způsobem ovlivnit vyhledávání rozlišující malá a velká písmena v závislosti na tom, kterou z výše uvedených metod používáte.
Možná nejsem úplně aktuální, ale nemyslím si, že migrace jádra EF se s řazením DB přirozeně zabývají, a pokud jste tabulku nevytvořili ručně, skončíte s výchozím řazením (rozlišují se malá a velká písmena pro sqlite a já upřímně nevím pro ostatní).
Vraťte se k původní otázce, máte alespoň 2 možnosti, jak provést toto vyhledávání bez rozlišení velkých a malých písmen, pokud ne 3 v budoucí verzi:
- Upřesněte řazení sloupců při vytváření pomocí DbContext.OnModelCreating() pomocí tohoto triku
- Nahraďte svůj
string.Contains
pomocíEF.Functions.Like()
- Nebo počkejte na slibnou funkci, o které se stále diskutuje:
EF.Functions.Collate()
funkce