2009-05-27 4 views
5

Ich verwende SQLite aus einem C# -Programm mit SQLite.net (http://sqlite.phxsoftware.com).Fall insensetive Reihenfolge von in SQLite in .net

Standardmäßig SQLite wählen Reihenfolge nach Klausel Sortierung ist Groß-und Kleinschreibung, ich möchte das Ergebnis zu sortieren Groß-und Kleinschreibung, ich fand "COLLATE NOCASE", aber die Dokumentation sagt nur englische Zeichen im ascii Bereich, ich will wahre linguistisch Bei der Sortierung nach CultureInfo.CurrentCulture wird die Sortierung nach Groß- und Kleinschreibung nicht berücksichtigt (die Verwendung von "String.Compere" wird den Zweck erfüllen).

Dank

Antwort

3

Ich glaube, eine solche Zusammenstellung wird in den aktuellen Versionen von SQLite nicht vorgesehen. Daher scheint es der vernünftigste Plan zu sein, die Sortierung aus der Abfrage zu entfernen und stattdessen danach in reinem .Net zu sortieren, wo Sie volle Kontrolle und Zugriff auf Konstrukte wie die Kulturinformationen des Threads haben.

Da beide im selben Prozess ablaufen, sollte dies keinen großen Unterschied in der Leistung ausmachen, es sei denn, Ihre Datenmenge ist sehr groß.

SQLite 3 erlaubt benutzerdefinierte Sortierfunktionen, die in SQLite.Net als .net-Funktionen ausgeführt werden können, aber der Aufwand für das Zurück- und Heraufrufen über die verwaltete/nicht verwaltete Grenze ist beträchtlich. Hier ist eine persons attempts to do it in c++. Es sei denn, Sie haben Zugriff auf jemand anderen gut getestete und stabile Unicode-Kultur-sensitive Sortierung in C++ Ich schlage vor, bei der einfachen Sortierung nach dem Ansatz wo möglich zu bleiben.

Natürlich, wenn die Leistung der benutzerdefinierten Sortierung mehr als genug für Ihre derzeitigen Bedürfnisse ist, dann gehen Sie damit.

[SQLiteFunction(Name = "CULTURESORT", FuncType = FunctionType.Collation)] 
class CultureSort : SQLiteFunction 
{ 
    public override int Compare(string param1, string param2) 
    { 
     return String.Compare(
      param1,param2, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase) 
     ); 
    } 
} 

Post Script, wenn Sie Lust bekommen Phantasie: Es ist ein gesegnetes Build von SQLite die integrates the ICU library für ‚richtige‘ Unicode-Unterstützung bei der Bestellung/wie/oben/unten, aber Sie möchten, dass in den SQLite-Code integrieren müssen wird als Hintergrund für den .Net-Wrapper verwendet. Das ist nicht einfach.

0

Ja, das ist viel komplexer, dass Sie es vermuten würden. In manchen Kulturen sind die Regeln anders und ohne zu wissen, welche Kultur man davon ableiten will, wird unmöglich. Betrachten Sie das berühmte Beispiel von Turkish.

1

Mit SQLite.NET können Sie benutzerdefinierte Funktionen in C# definieren, die Sie in SQL-Abfragen verwenden können. So sollte es möglich sein, eine custom_upper oder custom_lower Funktion in C# zu schreiben, die den Fall Umwandlung mit der aktuellen Kultur Sortierungs behandeln würde ...

-1

können Sie verwenden ToLower() Methode für das Erhalten schnelles Ergebnis:

return model.Users.OrderBy(u => u.Name.ToLower()).ToList(); 
+0

toooo langsam) ganze Reihe Umwandlung direkt mit der ersten paar Zeichen zu verwenden –

+0

Haben Sie es versuchen? Die Konvertierung erfolgt auf SQL-Seite. – Rover

+0

Ja. Ich glaube nicht, dass MSIL auf beiden Seiten unterschiedlich interpretiert wird. –

0

Sie können einfach die lower() sQLite-Funktion:

select * from data order by lower(name) 
+0

Nein nein nein, funktioniert nicht, aber theoretisch richtig –

+0

der richtige Weg wäre wählen * aus Datenreihenfolge von unteren (Name), Name –

+0

ich sehe nicht, warum es nicht funktionieren würde? – njzk2

Verwandte Themen