Я считаю, что такая сортировка не предусмотрена в текущих версиях SQLite. Таким образом, кажется, что наиболее разумным планом является удаление сортировки из запроса и последующая сортировка в чистом .Net, где у вас есть полный контроль и доступ к таким конструкциям, как информация о культуре потока.
Поскольку и то, и другое происходит в одном и том же процессе, это не должно иметь большого значения с точки зрения производительности, если только ваш набор данных не очень велик.
SQLite 3 позволяет определять пользовательские функции сопоставления, и их можно выполнять в SQLite.Net как функции .net, но накладные расходы на вызовы туда и обратно через управляемую/неуправляемую границу значительны. Вот один человек пытается сделать это на С++. Если у вас нет доступа к чьей-либо хорошо протестированной и стабильной сортировке с учетом культуры Unicode в 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 для "правильной" поддержки юникода при упорядочении/подобном/верхнем/нижнем, но вам нужно будет интегрировать это в код sqlite, используемый в качестве поддержки для оболочки .Net. Это многим непросто.
person
ShuggyCoUk
schedule
27.05.2009