【发布时间】:2014-10-11 02:58:02
【问题描述】:
SQLite 有 limitation 将 LIKE 用于非 ASCII 符号。 ICU 分机solves 这个问题。 如何在 C# 中编写代码以创建以下不区分大小写的语句:
SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'
附:如果在 C# LIKE 语句中使用非 ASCII 符号有其他解决方案,请提供。
【问题讨论】:
SQLite 有 limitation 将 LIKE 用于非 ASCII 符号。 ICU 分机solves 这个问题。 如何在 C# 中编写代码以创建以下不区分大小写的语句:
SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'
附:如果在 C# LIKE 语句中使用非 ASCII 符号有其他解决方案,请提供。
【问题讨论】:
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
【讨论】:
Contains 不需要额外的参数来区分大小写。
IEnumerable<Persons> p = persons.Where(x => x.surname.Contains("Пупкин"));
会产生
SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'
您不需要额外的参数,因为生成的 LIKE 语句已经自动不区分大小写。
虽然IndexOf() 是个好主意,但 LINQ2SQL 不支持它。
LINQ2SQL 不支持提供CultureInfo 的任何方式,而且我不确定SQLite 服务器比较InvariantCulture 或Ordinal。
编辑:当你设置EntityFramework with SQLite(我建议你)。您可以像这样检索数据:
string searchTerm = "Пупкин";
using (MyDatabaseContext context = new MyDatabaseContext())
{
IEnumerable<Persons> p = context.Persons.Where(x => x.surname.Contains(searchTerm));
}
【讨论】:
Where 方法。这样做时,它会产生 SQL 语句并在上下文对象所维护的连接对象上执行。
LIKE 在 SQL 中始终不区分大小写。当您使用 Linq2Sql 时,您可以执行 Contains() 方法,一旦您访问结果集合中的任何对象,它就会生成语句并执行它。您甚至可以放弃 EntityFramework 的想法并使用 SQLiteDbConnection 对象并执行看起来像您想要的语句的原始 SQL 语句。据我了解扩展帮助文档,它取代了一般的 LIKE,所以声明保持不变。希望我能帮上忙。