实体框架sqlite .Contains,CHARINDEX和unicode

时间:2017-02-12 19:16:08

标签: wpf entity-framework sqlite entity-framework-6

我有一个使用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,完全相同的代码工作正常并正确过滤掉所有内容。

我输了,任何帮助都会很棒。

0 个答案:

没有答案