Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Linq to Entities:Verwenden von ToLower() für NText-Felder

Verwenden Sie niemals .ToLower() um einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchzuführen. Hier ist der Grund:

  1. Es ist möglicherweise falsch (Ihre Client-Kollatierung könnte beispielsweise türkisch sein und Ihre DB-Kollatierung nicht).
  2. Es ist sehr ineffizient; das ausgegebene SQL ist LOWER statt = mit einer Sortierung ohne Berücksichtigung der Groß-/Kleinschreibung.

Verwenden Sie stattdessen StringComparison.OrdinalIgnoreCase oder StringComparison.CurrentCultureIgnoreCase :

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

Aber für Contains() es gibt ein Problem:Im Gegensatz zu Equals , StartsWith usw. hat es keine Überladung für einen StringComparison Streit. Wieso den? Gute Frage; Fragen Sie Microsoft.

Das, kombiniert mit der Beschränkung von SQL Server auf LOWER bedeutet, dass es keinen einfachen Weg gibt, das zu tun, was Sie wollen.

Mögliche Problemumgehungen könnten sein:

  • Verwenden Sie einen Volltextindex und führen Sie die Suche in einer Prozedur durch.
  • Verwenden Sie Equals oder StartsWith stattdessen, wenn dies für Ihre Aufgabe möglich ist
  • Standardsortierung der Spalte ändern?