使用 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%'*/
它会找到 Mexico、Mé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