如何使用 ICU 扩展为 SQLIte 编写不区分大小写的 C# LIKE 语句

本文关键字:大小写 语句 LIKE 不区 ICU 何使用 扩展 SQLIte | 更新日期: 2023-09-27 18:18:21

>SQLite 对非 ASCII 符号使用 LIKE 有限制。ICU扩展解决了这个问题。如何使用 C# 编写代码以创建以下不区分大小写的语句:

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

附言如果有另一种解决方案可以在 C# LIKE 语句中用于非 ASCII 符号,请提供它。

如何使用 ICU 扩展为 SQLIte 编写不区分大小写的 C# LIKE 语句

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

我尝试了这个替代方案,可能会对您有所帮助:

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

请尝试向我们提供反馈,如果它是否有效。

C# 代码

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

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

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

将产生

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

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

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

编辑:当你用SQLite设置实体框架时(我建议你(。您可以像这样检索数据:

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