如何使用ICU扩展为SQLIte编写C#case insensitive LIKE语句?

时间:2014-08-18 08:33:54

标签: c# sqlite icu

对于非ASCII符号,SQLite使用LIKE limitation。 ICU扩展solves这个问题。 如何用C#编写代码来创建以下不区分大小写的语句:

SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'

P.S。如果有另一种解决方案在C#LIKE语句中使用非ASCII符号,请提供它。

4 个答案:

答案 0 :(得分:0)

var result = people.Where(x=> x.Surname.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1);

答案 1 :(得分:0)

我试过这个替代方案,可能会对你有所帮助:

 _database.Table<People>.Where(c => c.surname.ToUpper().Contains("Пупкин".ToUpper())  )

如果有效,请尝试给我们反馈。

答案 2 :(得分:-1)

C#代码

var lst = (From p In persons
            Where p.surname.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) >= 0
            Select p).ToList()

InvariantCultureIgnoreCaseString.IndexOf方法的选项之一。这可能有助于您实现C#LIKE

答案 3 :(得分:-1)

IEnumerable<Persons> p = persons.Where(x => x.surname.Contains("Пупкин"));

将产生

SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'

您不需要其他参数,因为生成的LIKE语句已自动不区分大小写。

虽然IndexOf()是个好主意,但LINQ2SQL不支持它。 LINQ2SQL不支持任何提供CultureInfo的方法,我不确定SQLite Server是否会比较InvariantCultureOrdinal

编辑:设置EntityFramework with SQLite时(我建议您)。您可以像这样检索数据:

string searchTerm = "Пупкин";
using (MyDatabaseContext context = new MyDatabaseContext())
{
    IEnumerable<Persons> p = context.Persons.Where(x => x.surname.Contains(searchTerm));
}