使用 SQL Server Compact 4.0 在实体框架中进行 LIKE 查询

Posted

技术标签:

【中文标题】使用 SQL Server Compact 4.0 在实体框架中进行 LIKE 查询【英文标题】:LIKE query in Entity Framework with SQL Server Compact 4.0 【发布时间】:2011-04-25 03:33:13 【问题描述】:

我在使用 SQL Server Compact 作为后端的 EF CodeFirst 查询时遇到以下问题。

LINQ 表达式为:

var results = (from c in x.Countries where c.Name.StartsWith(term) select c);

根据我的发现,输出应该在 WHERE 子句中使用 LIKE 运算符,但正在运行的 SQL 是:

SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name]
FROM [Countries] AS [Extent1]
WHERE (CHARINDEX(@p__linq__0, [Extent1].[Name])) = 1

发生了什么事?

编辑:我也尝试过使用 Contains(term),生成的 SQL 不同,但也不使用 LIKE

【问题讨论】:

【参考方案1】:

CHARINDEX 是等效的,性能稍好一些。

为什么需要 LIKE?

更新:有更好的方法来满足您的需求。

不要让查询变得更复杂,而是让列不区分重音

例子:

CREATE TABLE Countries (
    Name nvarchar(50) COLLATE Modern_Spanish_CI_AI,
    ...

(一个稍微好一点的方法是让整个数据库默认不区分重音)

这样,你(或 EF)可以写:

SELECT *
FROM Countries
WHERE CHARINDEX('Mex', Name) = 1
/*or Name LIKE 'Mex%'*/

它会找到 MexicoMéxico 等。它更容易处理并且对用户更友好(想想 Google:它不会强迫您使用特殊的查找重音/非重音变体的语法)

【讨论】:

我正在使用西班牙语国家名称。因此,例如,如果我正在寻找 México(注意“e”上方的标记),即使用户输入了 Mexico(没有标记),我也想找到它。使用 LIKE,我会执行类似以下的查询:WHERE [Name] LIKE N'M[eé]x%'。如果上面的代码我提供 StartsWith("M[eé]x") 代码返回一个空列表。 我正在制作的应用程序相当简单,所以我让 EF 创建数据库。有没有办法让 DB EF 创建 Accent-Insensitive? @Kiranu:创建后可以运行ALTER DATABASE [name_of_the_db] COLLATE Modern_Spanish_CI_AI

以上是关于使用 SQL Server Compact 4.0 在实体框架中进行 LIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章

缺少 Sql Server Compact 4.0 提供程序

从 SQL Server Compact 4.0 迁移到 SQL Server Express 后提供程序错误

nlog 和 SQL Server Compact 4.0 的示例配置

SQL Server Compact 4.0 图像列被截断为 8000

SSIS 可以输出 SQL Server Compact 4.0 文件吗?

更改 SQL Server Compact 4.0 的排序规则