2009-05-27 8 views
5

Sto usando SQLite da un programma C# usando SQLite.net (http://sqlite.phxsoftware.com).ordine insensetivo di case in SQLite in .net

Per impostazione predefinita SQLite selezionare l'ordine dalla clausola di ordinamento è case sensitive, voglio il risultato per ordinare case insensitive, ho trovato "COLLATE NOCASE", ma la documentazione dice che gestire solo caratteri inglesi nella gamma ASCII, voglio vera linguistica ordinamento internazionale senza distinzione tra maiuscole e minuscole utilizzando le regole di confronto CultureInfo.CurrentCulture (il che rende utilizza String.Compere farà il trucco).

Grazie

risposta

3

credo ad esempio le regole di confronto non è previsto nelle versioni attuali di SQLite. Come tale sembrerebbe che il piano più sensato sia quello di rimuovere l'ordinamento dalla query e invece di ordinare successivamente in puro .Net dove si ha il pieno controllo e l'accesso a costrutti come le informazioni sulla cultura del thread.

Poiché entrambi si verificano nello stesso processo, ciò non dovrebbe fare una grande differenza in termini di prestazioni a meno che il set di dati non sia molto grande.

SQLite 3 consente funzioni di confronto definite dall'utente e queste possono essere eseguite in SQLite.Net come funzioni .net ma il sovraccarico di chiamata avanti e indietro attraverso il limite gestito/non gestito è notevole. Ecco uno persons attempts to do it in c++. A meno che tu non abbia accesso a un ordinamento sensibile alla cultura unicode ben testato e stabile in C++ di qualcun altro, suggerisco di attenermi al semplice tipo dopo approccio, ove possibile.

Naturalmente se le prestazioni delle regole di confronto definite dall'utente sono più che sufficienti per le vostre esigenze attuali, passate a quello.

[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) 
     ); 
    } 
} 

script di post, se avete voglia di fantasia: C'è un accumulo benedetto di SQLite che integrates the ICU library per 'adeguato' supporto Unicode su ordinazione/come/superiore/inferiore, ma si avrebbe bisogno di integrare che nel codice sqlite usato come supporto per il wrapper .Net. Questo non è facile.

0

Sì, questo è molto più complesso di quanto si possa immaginare. In alcune culture le regole sono diverse e senza sapere quale cultura si vuole basare su di essa diventa impossibile. Si consideri il famoso esempio (tra cui i18n people) di Turkish.

1

SQLite.NET consente di definire funzioni personalizzate in C# che è possibile utilizzare nelle query SQL. Così dovrebbe essere possibile scrivere una funzione custom_upper o custom_lower in C#, che avrebbe gestito la conversione caso con le regole di confronto attuale cultura ...

-1

È possibile utilizzare ToLower() metodo per ottenere il risultato rapido:

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

toooo lento) la conversione di tutta una serie solo per utilizzare primo paio di personaggi –

+0

hai provato esso? La conversione avviene sul lato SQL. – Rover

+0

Sì. Non credo che msil sia interpretato in modo diverso su entrambi i lati. –

0

si può semplicemente utilizzare la funzione lower() sqlite:

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

No no no, non funziona, ma teoricamente a destra –

+0

il modo corretto sarebbe selezionare * dall'ordine dei dati in basso (nome), nome –

+0

non vedo perché non funzionerebbe? – njzk2