sql >> Database >  >> RDS >> Sqlserver

Linq to Entities:ToLower() gebruiken op NText-velden

Gebruik nooit .ToLower() om een ​​hoofdletterongevoelige vergelijking uit te voeren. Dit is waarom:

  1. Het is mogelijk verkeerd (uw client-sortering kan bijvoorbeeld Turks zijn, en uw database-sortering niet).
  2. Het is zeer inefficiënt; de uitgezonden SQL is LOWER in plaats van = met een hoofdletterongevoelige sortering.

Gebruik in plaats daarvan StringComparison.OrdinalIgnoreCase of StringComparison.CurrentCultureIgnoreCase :

var q = from f in Context.Foos
        where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase)
        select f;

Maar voor Contains() er is een probleem:in tegenstelling tot Equals , StartsWith , enz., heeft het geen overbelasting voor een StringComparison argument. Waarom? Goede vraag; vraag het Microsoft.

Dat, gecombineerd met de beperking van SQL Server op LOWER betekent dat er geen eenvoudige manier is om te doen wat je wilt.

Mogelijke oplossingen zijn onder meer:

  • Gebruik een volledige tekstindex en zoek in een procedure.
  • Gebruik Equals of StartsWith in plaats daarvan, indien mogelijk voor uw taak
  • De standaardsortering van de kolom wijzigen?


  1. Mysql-kolombeperking als niet leeg / vereist

  2. Oracle 'printf'-equivalent

  3. Filter records uit die niet in dit datumformaat zijn orakel

  4. Wat betekent een dubbele punt voor een letterlijke in een SQL-instructie?