Vroeger was dit het geval voor oudere versies van EF core. Nu string.Contains
is hoofdlettergevoelig, en bijvoorbeeld voor sqlite verwijst het naar de sqlite-functie `instr()' (ik weet het niet voor postgresql).
Als je strings op een hoofdletterongevoelige manier wilt vergelijken, heb je DbFunctions om het werk te doen.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
UPDATE naar @Gert:
Een deel van de aanname in de vraag is onjuist. string.Contains
converteert NIET naar een LIKE expression
ook al was dit vroeger het geval in ef core-versies <=1.0 (denk ik).
- In SQLServer
string.contains
converteert naarCHARINDEX()
, in oracle en sqlite ininstr()
die standaard hoofdlettergevoelig zijn TENZIJ db- of kolomsortering anders is gedefinieerd ( Nogmaals, ik weet het niet voor postgresql ). - In alle gevallen
EF.Functions.Like()
converteert naar een SQLLIKE
expressie die standaard niet hoofdlettergevoelig is, tenzij db of kolomsortering anders is gedefinieerd.
Dus ja, het komt allemaal neer op sorteren, maar - corrigeer me als ik het mis heb - in zekere zin kan de code invloed hebben op het hoofdlettergevoelig/ongevoelig zoeken, afhankelijk van welke van de bovenstaande methoden je gebruikt.
Nu ben ik misschien niet helemaal up-to-date, maar ik denk niet dat EF-kernmigraties natuurlijk omgaan met DB-sortering en tenzij je de tabel al handmatig hebt gemaakt, krijg je de standaardsortering (hoofdlettergevoelig voor sqlite en ik weet het eerlijk gezegd niet voor de anderen).
Om terug te komen op de oorspronkelijke vraag, u heeft ten minste 2 opties om deze hoofdletterongevoelige zoekopdracht uit te voeren, zo niet 3 in een toekomstige release:
- Specificeer de kolomsortering bij het maken met behulp van DbContext.OnModelCreating() met deze truc
- Vervang je
string.Contains
doorEF.Functions.Like()
- Of wacht op een veelbelovende functie die nog in discussie is:
EF.Functions.Collate()
functie