sql >> Database >  >> RDS >> PostgreSQL

Entity Framework core - Bevat is hoofdlettergevoelig of niet hoofdlettergevoelig?

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 naar CHARINDEX() , in oracle en sqlite in instr() 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 SQL LIKE 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:

  1. Specificeer de kolomsortering bij het maken met behulp van DbContext.OnModelCreating() met deze truc
  2. Vervang je string.Contains door EF.Functions.Like()
  3. Of wacht op een veelbelovende functie die nog in discussie is:EF.Functions.Collate() functie


  1. MySQL-clienttoepassingen gebruiken

  2. Schakel SQL Server Agent in via SSMS

  3. Oracle 12.2 Sharding

  4. Return als array van JSON-objecten in SQL (Postgres)