случайный порядок в SQLite в .net - PullRequest
5 голосов
/ 28 мая 2009

Я использую SQLite из программы на C # с использованием SQLite.net (http://sqlite.phxsoftware.com).

По умолчанию порядок выбора SQLite по условию сортировки чувствителен к регистру, я хочу, чтобы результат сортировки чувствительный к регистру, я обнаружил «COLLATE NOCASE», но в документации сказано, что он будет обрабатывать только английские символы в диапазоне ascii, я хочу истинно лингвистический сортировка без учета регистра с использованием параметров сортировки CultureInfo.CurrentCulture (с помощью String.Compere все получится).

Спасибо

Ответы [ 5 ]

3 голосов
/ 28 мая 2009

Я полагаю, что такое сопоставление не предоставляется в текущих версиях SQLite. Таким образом, может показаться, что наиболее разумным планом является удаление сортировки из запроса и последующая сортировка в чистом .Net, где вы имеете полный контроль и доступ к конструкциям, таким как информация о культуре потока.

Поскольку оба процесса происходят в одном и том же процессе, это не должно иметь большого значения с точки зрения производительности, если ваш набор данных не очень большой.

SQLite 3 допускает определенные пользователем функции сортировки, и они могут быть выполнены в SQLite.Net как функции .net, но накладные расходы на обратный вызов через управляемую / неуправляемую границу значительны. Вот один человек пытается сделать это в C ++ . Если у вас нет доступа к чьей-либо другой проверенной и стабильной сортировке, чувствительной к культуре Юникода, в 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)
        );
    }
}

Опубликуйте сценарий, если вам интересно: Существует благословенная сборка SQLite, которая интегрирует библиотеку ICU для «правильной» поддержки юникода при упорядочении / like / upper / lower, но вам нужно будет интегрировать это в код sqlite, используемый в качестве основы для. Чистая обертка. Это много нелегко.

1 голос
/ 28 мая 2009

SQLite.NET позволяет вам определять пользовательские функции в C #, которые вы можете использовать в запросах SQL. Таким образом, должна быть возможность написать функцию custom_upper или custom_lower на C #, которая будет обрабатывать преобразование с текущим сопоставлением культуры ...

0 голосов
/ 11 октября 2011

Вы можете просто использовать функцию lower() sqlite:

select * from data order by lower(name)
0 голосов
/ 22 ноября 2010

Вы можете использовать метод ToLower () для получения быстрого результата:

return model.Users.OrderBy(u => u.Name.ToLower()).ToList();
0 голосов
/ 28 мая 2009

Да, это намного сложнее, чем вы могли бы догадаться. В некоторых культурах правила разные, и без знания, какую культуру вы хотите основать на этом, становится невозможным. Рассмотрим знаменитый (среди 1818 человек) пример турецкий .

...