我有一个使用Sqlite作为数据库的WPF应用程序,使用Entity Framework 6。 问题是,当我尝试使用Queryable.Contains过滤掉值时,如果数据为Georgian Unicode个字符,则结果不会被过滤掉。
考虑这样的事情
using (var db = GetDb())
{
var patientsQuery = db.Patients.AsNoTracking().AsQueryable();
if (!string.IsNullOrWhiteSpace(searchParam))
{
patientsQuery = patientsQuery.Where(patient => (patient.FirstName + " " + patient.LastName).ToLower().Contains(searchParam.ToLower()));
}
var patients = patientsQuery.ToList();
}
奇怪的是,当我检查patients
变量时,它显示所有来自db的患者,其中First和Last名称设置为unicode字符,结果不会被searchParam过滤。如果我有6条记录,其中3条是georgian unicode,其中一条匹配searchParam,则查询返回所有三条记录。
此外,最困扰我的是当我从patientsQuery变量或数据库日志输出中探索生成的sql时,它显示了这个
SELECT
[Extent1].[PatientId] AS [PatientId],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[CreateDate] AS [CreateDate],
[Extent1].[ProfileFolder] AS [ProfileFolder],
[Extent1].[Comment] AS [Comment]
FROM [Patients] AS [Extent1]
WHERE (((CHARINDEX(LOWER(@p__linq__0), LOWER(CASE WHEN ([Extent1].[FirstName] IS NULL) THEN '' ELSE [Extent1].[FirstName] END || ' ' || CASE WHEN ([Extent1].[LastName] IS NULL) THEN '' ELSE [Extent1].[LastName] END))) > 0) OR ( EXISTS (SELECT
1 AS [C1]
FROM [PatientImages] AS [Extent2]
WHERE ([Extent1].[PatientId] = [Extent2].[PatientId]) AND ((CHARINDEX(@p__linq__1, [Extent2].[Comment])) > 0)
))) OR ((CHARINDEX(@p__linq__2, [Extent1].[Comment])) > 0)
-- p__linq__0: 'არჩ' (Type = String)
-- p__linq__1: 'არჩ' (Type = String)
-- p__linq__2: 'არჩ' (Type = String)
-- Executing at 2/12/2017 11:08:03 PM +04:00
-- Completed in 0 ms with result: SQLiteDataReader
但是Sqlite中没有 charindex ,所以我无法真正了解幕后发生的事情,以及如何查看用于检索数据的确切查询。如果数据和搜索字符串是非unicode,完全相同的代码工作正常并正确过滤掉所有内容。
我输了,任何帮助都会很棒。