6

SQLite.net ( http://sqlite.phxsoftware.com ) を使用して C# プログラムから SQLite を使用しています。

デフォルトでは、SQLite select order by clause ソートは大文字と小文字を区別します。結果を大文字と小文字を区別せずにソートしたいのですが、「COLLATE NOCASE」を見つけましたが、ドキュメントには、ASCII 範囲内の英語の文字のみを処理すると書かれています。真の言語の国際的な大文字と小文字を区別しないソートが必要です。 CultureInfo.CurrentCulture 照合順序を使用します (String.Compare を使用するとうまくいきます)。

4

5 に答える 5

3

このような照合は、現在のバージョンの SQLite では提供されていないと思います。そのため、最も賢明な計画は、クエリから並べ替えを削除し、代わりにスレッドのカルチャ情報のような構成要素を完全に制御およびアクセスできる純粋な .Net で後で並べ替えることです。

両方が同じプロセスで発生しているため、データセットが非常に大きい場合を除き、パフォーマンスの点で大きな違いはありません。

SQLite 3 ではユーザー定義の照合関数を使用できます。これらは SQLite.Net で .net 関数として実行できますが、管理対象/非管理対象の境界を越えて呼び出しを行うオーバーヘッドはかなりのものです。これは、 c++ でそれを実行しようとする1人です。C ++で他の誰かのよくテストされた安定したユニコードカルチャに依存するソートにアクセスできない限り、可能な場合は単純なソート後のアプローチに固執することをお勧めします。

もちろん、ユーザー定義の照合のパフォーマンスが現在のニーズに対して十分すぎる場合は、それを使用してください。

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

気に入った場合のスクリプトの投稿: ICU ライブラリを統合したSQLite の祝福されたビルドがあり、ordering/like/upper/lower で「適切な」ユニコード サポートを提供しますが、それをバッキングとして使用される sqlite コードに統合する必要があります。 .Net ラッパー。これは簡単なことではありません。

于 2009-05-27T21:43:22.840 に答える
1

lower()sqlite関数を使用するだけです。

select * from data order by lower(name)
于 2011-10-11T14:49:33.700 に答える
-1

迅速な結果を得るために ToLower() メソッドを使用できます。

return model.Users.OrderBy(u => u.Name.ToLower()).ToList();
于 2010-11-22T12:08:30.883 に答える