2011-04-25 41 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

相關問題