我正在使用 SQLite.net ( http://sqlite.phxsoftware.com ) 的 C# 程序中使用 SQLite。
默认情况下,SQLite 选择 order by 子句排序区分大小写,我希望结果不区分大小写,我发现“COLLATE NOCASE”但文档说它只会处理 ascii 范围内的英文字符,我想要真正的语言国际不区分大小写排序使用 CultureInfo.CurrentCulture 排序规则(让它使用 String.Compare 就可以了)。
我正在使用 SQLite.net ( http://sqlite.phxsoftware.com ) 的 C# 程序中使用 SQLite。
默认情况下,SQLite 选择 order by 子句排序区分大小写,我希望结果不区分大小写,我发现“COLLATE NOCASE”但文档说它只会处理 ascii 范围内的英文字符,我想要真正的语言国际不区分大小写排序使用 CultureInfo.CurrentCulture 排序规则(让它使用 String.Compare 就可以了)。
我相信当前版本的 SQLite 中没有提供这种排序规则。因此,似乎最明智的计划是从查询中删除排序,然后在纯 .Net 中排序,您可以完全控制和访问线程的文化信息等结构。
由于两者都发生在同一个过程中,除非您的数据集非常大,否则这不会在性能方面产生很大差异。
SQLite 3 确实允许用户定义排序规则函数,这些可以在 SQLite.Net 中作为 .net 函数完成,但是跨托管/非托管边界来回调用的开销是相当大的。这是一个人尝试在 c++ 中进行的尝试。除非您可以访问其他人在 C++ 中经过良好测试且稳定的 unicode 文化敏感排序,否则我建议尽可能坚持使用简单排序后的方法。
当然,如果用户定义的排序规则的性能足以满足您当前的需求,那就去吧。
[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 库,用于在 ordering/like/upper/lower 上提供“适当”的 unicode 支持,但你需要将它集成到用作支持的 sqlite 代码中.Net 包装器。这很多都不容易。
SQLite.NET 允许您在 C# 中定义可在 SQL 查询中使用的自定义函数。所以应该可以在 C# 中编写一个 custom_upper 或 custom_lower 函数来处理当前区域性排序规则的大小写转换......
您可以简单地使用lower()
sqlite 函数:
select * from data order by lower(name)
是的,这比你想象的要复杂得多。在某些文化中,规则是不同的,如果不知道你想要建立什么样的文化,那就不可能了。考虑著名的(在 i18n 人中)土耳其语的例子。
您可以使用 ToLower() 方法来获得快速结果:
return model.Users.OrderBy(u => u.Name.ToLower()).ToList();