在.net中的SQLite中不区分大小写的顺序

时间:2009-05-27 20:17:06

标签: .net sqlite sql-order-by case-insensitive

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

默认情况下,SQLite select order by子句排序区分大小写,我希望结果排序不区分大小写,我发现“COLLATE NOCASE”但文档说它只会处理ascii范围内的英文字符,我想要真正的语言国际使用CultureInfo.CurrentCulture排序规则进行不区分大小写的排序(使其使用String.Compere将执行此操作)。

由于

5 个答案:

答案 0 :(得分:3)

我认为当前版本的SQLite中没有提供这种排序规则。因此,似乎最明智的计划是从查询中删除排序,然后在纯.Net中进行排序,在那里您可以完全控制并访问线程的文化信息等构造。

由于两者都在同一过程中发生,因此除非您的数据集非常大,否则这不应对性能术语产生重大影响。

SQLite 3允许用户定义的排序规则功能,这些功能可以在SQLite.Net中作为.net函数完成,但是在托管/非托管边界之间来回调用的开销相当大。这是一个persons attempts to do it in 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版本integrates the ICU library用于'正确'unicode支持订购/喜欢/上/下,但你需要将它集成到用作.Net包装器支持的sqlite代码中。这很多不容易。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

是的,这比你猜的要复杂得多。在某些文化中,规则是不同的,不知道你想要什么样的文化,它变得不可能。考虑Turkish的着名(amoung i18n人)示例。

答案 3 :(得分:0)

您只需使用lower() sqlite函数:

select * from data order by lower(name)

答案 4 :(得分:-1)

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

return model.Users.OrderBy(u => u.Name.ToLower()).ToList();