2011-04-25 42 views
1

对于使用SQL Server Compact作为后端的EF CodeFirst查询,我遇到了以下问题。使用SQL Server Compact 4.0在实体框架中进行LIKE查询

的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 

这是怎么回事?

编辑:我使用也试过包含(项),生成的SQL是不同的,但它不使用LIKE要么

回答

2

CHARINDEX是等价的,有表现略好。

为什么你需要一个LIKE?

更新:有更好的方法来做你所需要的。

而不是使查询更复杂,使列不区分重音

例子:

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

(稍微好一点的方法是使整个DB不区分重音默认)

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

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

它会发现墨西哥,墨西哥等。它更容易处理和更友好的用户界面(想想谷歌:它不会强制你使用特殊的语法来查找重音/非重音变体)

+0

我正在用西班牙语的国家名称工作。例如,如果我正在寻找墨西哥(注意'e'上方的标记),即使用户输入墨西哥(没有标记),我也想查找它。与我一样,我会做一个类似这样的查询:WHERE [Name] LIKE N'M [eé] x%'。如果对上面的代码,我提供StartsWith(“M [eé] x”)代码返回一个空列表。 – 2011-04-25 22:41:03

+0

@Kiranu:查看编辑 – 2011-04-25 23:44:20

+0

我正在制作的应用程序是一件相当简单的事情,所以我让EF创建数据库。有没有办法让数据库EF创建Accent-Insensitive? – 2011-04-26 01:31:25

相关问题