Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net net中SQLite中不区分大小写的order by_.net_Sqlite_Sql Order By_Case Insensitive - Fatal编程技术网

.net net中SQLite中不区分大小写的order by

.net net中SQLite中不区分大小写的order by,.net,sqlite,sql-order-by,case-insensitive,.net,Sqlite,Sql Order By,Case Insensitive,我正在使用SQLite.net的C程序中的SQLite 默认情况下,SQLite select order By子句排序区分大小写,我希望结果排序不区分大小写,我找到了COLLATE NOCASE,但文档说它只处理ascii范围内的英文字符,我希望使用CultureInfo.CurrentCulture排序规则实现真正的语言国际不区分大小写排序,使其使用String.Compare即可。我相信当前版本的SQLite中不提供此类排序规则。因此,最明智的计划似乎是从查询中删除排序,然后在纯.Net中

我正在使用SQLite.net的C程序中的SQLite


默认情况下,SQLite select order By子句排序区分大小写,我希望结果排序不区分大小写,我找到了COLLATE NOCASE,但文档说它只处理ascii范围内的英文字符,我希望使用CultureInfo.CurrentCulture排序规则实现真正的语言国际不区分大小写排序,使其使用String.Compare即可。

我相信当前版本的SQLite中不提供此类排序规则。因此,最明智的计划似乎是从查询中删除排序,然后在纯.Net中进行排序,在纯.Net中,您可以完全控制和访问线程的区域性信息等结构

因为这两种情况都发生在同一个过程中,所以除非您的数据集非常大,否则在性能方面不会有太大的差异

SQLite 3允许用户定义的排序函数,这些函数可以在SQLite.Net中作为.Net函数完成,但是跨托管/非托管边界来回调用的开销相当大。这里有一个。除非你能访问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有一个很好的构建,它在排序/like/upper/lower时提供了“适当的”unicode支持,但是您需要将其集成到SQLite代码中,作为.Net包装的支持。这并不容易

是的,这比你想象的要复杂得多。在某些文化中,规则是不同的,如果不知道你想以什么文化为基础,规则就变得不可能了。考虑著名的MuffigI18n人的例子,

SQL.NET允许您在C中定义自定义函数,您可以在SQL查询中使用这些函数。因此,应该可以用C编写一个自定义上下函数,用当前区域性排序规则处理大小写转换…

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

return model.Users.OrderBy(u => u.Name.ToLower()).ToList();
您可以简单地使用lower sqlite函数:

select * from data order by lower(name)

正确的方法是按lowername从数据顺序中选择*,nameSQLite lower也有同样的问题,就像order by-works只针对ASCII一样。您必须编写自己的函数,请参见下一个答案:转换整个字符串的速度太慢,只需使用前两个字符。您是否尝试过?它发生在SQL端。是。我不认为msil在任何一方都有不同的解释。