6

我正在使用 SQLite.net ( http://sqlite.phxsoftware.com ) 的 C# 程序中使用 SQLite。

默认情况下,SQLite 选择 order by 子句排序区分大小写,我希望结果不区分大小写,我发现“COLLATE NOCASE”但文档说它只会处理 ascii 范围内的英文字符,我想要真正的语言国际不区分大小写排序使用 CultureInfo.CurrentCulture 排序规则(让它使用 String.Compare 就可以了)。

4

5 回答 5

3

我相信当前版本的 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 包装器。这很多都不容易。

于 2009-05-27T21:43:22.840 回答
1

SQLite.NET 允许您在 C# 中定义可在 SQL 查询中使用的自定义函数。所以应该可以在 C# 中编写一个 custom_upper 或 custom_lower 函数来处理当前区域性排序规则的大小写转换......

于 2009-05-27T22:04:05.027 回答
1

您可以简单地使用lower()sqlite 函数:

select * from data order by lower(name)
于 2011-10-11T14:49:33.700 回答
0

是的,这比你想象的要复杂得多。在某些文化中,规则是不同的,如果不知道你想要建立什么样的文化,那就不可能了。考虑著名的(在 i18n 人中)土耳其语的例子。

于 2009-05-27T21:56:46.477 回答
-1

您可以使用 ToLower() 方法来获得快速结果:

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