2009-05-27 5 views
5

Używam SQLite z programu C# przy użyciu SQLite.net (http://sqlite.phxsoftware.com).case insensetive order by in SQLite in .net

Domyślnie SQLite wybrać porządek według klauzuli sortuje wielkość liter, chcę, aby wynik sortował wielkość liter, znalazłem "COLLATE NOCASE", ale dokumentacja mówi, że obsługuje tylko znaki angielskie w zakresie ASCII, chcę prawdziwego lingwistycznego międzynarodowy sortowanie bez rozróżniania wielkości liter przy użyciu sortowania CultureInfo.CurrentCulture (dzięki czemu String.Compere zrobi lewy).

Dzięki

Odpowiedz

3

wierzę takich zestawień nie jest w obecnych wersjach SQLite. Jako taki wydaje się, że najbardziej sensownym planem jest usunięcie sortowania z kwerendy, a następnie sortowanie w czystym .Net, gdzie masz pełną kontrolę i dostęp do konstruktów, takich jak informacje o wątku kultury.

Ponieważ oba mają miejsce w tym samym procesie, nie powinno to mieć większego wpływu na wydajność, chyba że zbiór danych jest bardzo duży.

SQLite 3 pozwala na zdefiniowane przez użytkownika funkcje sortowania, a te można wykonać w SQLite.Net jako funkcje .net, ale obciążenie związane z wywoływaniem w poprzek zarządzanej/niezarządzanej granicy jest znaczne. Oto jeden persons attempts to do it in c++. Jeśli nie masz dostępu do dobrze sprawdzonego i stabilnego sortowania kulturowego z unikodnym unicode w C++, sugeruję trzymanie się prostego sortowania po podejściu, jeśli to możliwe.

Oczywiście, jeśli wydajność sortowania zdefiniowanego przez użytkownika jest więcej niż wystarczająca dla twoich obecnych potrzeb, to idź z tym.

[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 jeśli masz ochotę się fantazyjne: Jest błogosławiony kompilacji SQLite które integrates the ICU library do „właściwego” wsparcia unicode na zamawianie/jak/górna/dolna ale trzeba by zintegrować że do kodu sqlite używany jako podkład dla owijki .Net. To nie jest łatwe.

0

Tak, jest to o wiele bardziej złożone, niż można się domyślić. W niektórych kulturach reguły są różne i nie wiadomo, z jakiej kultury chce się je oprzeć. Weźmy pod uwagę słynny (np. Ludzie i18n) przykład Turkish.

1

SQLite.NET umożliwia zdefiniowanie niestandardowych funkcji w języku C#, których można używać w zapytaniach SQL. Tak powinno być możliwe, aby napisać custom_upper lub custom_lower funkcję w C#, który będzie obsługiwać konwersję przypadku obecnego kultury zestawień ...

-1

Można użyć Metoda ToLower() metody uzyskiwania szybki wynik:

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

toooo powolny) przekształcenie cały ciąg tylko do korzystania pierwsze kilka znaków –

+0

Czy spróbować? Konwersja następuje po stronie SQL. – Rover

+0

Tak. Nie sądzę, że msil jest interpretowany inaczej po obu stronach. –

0

można po prostu użyć funkcji lower() sqlite:

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

Nie, nie nie, nie działa, ale teoretycznie prawidłowa –

+0

właściwa droga byłaby wybrana * od kolejność danych według niższej (nazwa), nazwa –

+0

nie rozumiem, dlaczego to nie zadziałałoby? – njzk2