2011-06-15 71 views
11

我有一個數據庫表,其中包含帶有重音字符的名稱。像ä等。在使用實體框架搜索數據​​庫時忽略重音

我需要從包含一些子字符串的表中使用EF4獲取所有記錄,而不管其口音

所以下面的代碼:

myEntities.Items.Where(i => i.Name.Contains("a")); 

應該返回所有項目包含a一個名字,而且還含有äâ等所有項目。這可能嗎?

+2

你使用的數據庫是?您可能必須在該列上設置不區分重音的整理順序。 – stuartd 2011-06-15 12:05:49

+0

使用MSSQL 2008的Im – 2011-06-15 12:09:33

+0

您可以在EF中使用此方法嗎? http://stackoverflow.com/questions/2461522/how-do-i-perform-an-accent-insensitive-compare-e-with-eee-and-e-in-sql-serv – stuartd 2011-06-15 12:10:28

回答

9

如果你設置的名稱列口音大小寫排序順序然後根據需要查詢應該工作。

+0

如何通過代碼更改特定列的排序規則? – 2013-01-17 22:53:49

+1

@AlejandrodelRío參見http://blog.sqlauthority.com/2008/12/20/sql-server-change-collat​​ion-of-database-column-t-sql-script/舉例 – stuartd 2013-01-18 10:27:56

+0

這是無法完成的當你已經創建了表格並且裏面有數據的時候。至少在sql server 2008 R2中。當您創建新表或新數據庫時,完全沒有問題。無論如何,我的問題是關於實體框架。謝謝。 – 2013-01-22 21:20:19

-3

不區分重音的排序規則斯圖爾特·凱爾德建議絕對是最好的解決辦法...

但也許好知道:

邁克爾·卡普蘭曾發佈了關於剝離變音符號:

static string RemoveDiacritics(string stIn) 
{ 
    string stFormD = stIn.Normalize(NormalizationForm.FormD); 
    StringBuilder sb = new StringBuilder(); 

    for(int ich = 0; ich < stFormD.Length; ich++) 
    { 
     UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); 
     if(uc != UnicodeCategory.NonSpacingMark) 
     { 
      sb.Append(stFormD[ich]); 
     } 
    } 

    return(sb.ToString().Normalize(NormalizationForm.FormC)); 
} 

Source

所以,你的代碼是:

myEntities.Items.Where(i => RemoveDiacritics(i.Name).Contains("a")); 
+2

您的示例將不起作用,因爲'RemoveDiacritics'將不得不在SQL服務器上運行。 – 2011-06-15 12:51:16

+0

正如@Ladislav所說,這會從* input *字符串中刪除重音(可能已經沒有重音),並檢查仍然關注重音符的數據庫。這實際上會使情況變得更糟,因爲即使用戶在執行搜索時實際上懶得編寫重音符號,也會將其轉換爲a,甚至找不到數據庫中的''。但是,很高興知道有一種方法可以去掉C#中的字符串的重音符號,因爲我需要這樣做;) – 2011-06-15 12:56:28

+0

@ØyvindKnobloch-Bråthen - 我認爲你的輸入字符串是''a「',而' i.Name'是數據庫中的一個,但是這隻能是一種方法去除那些更加麻煩的重音符號,等等= D – ordag 2011-06-15 13:20:26

0

我知道這是不那麼幹淨的解決方案,但閱讀this後,我想是這樣的:

var query = this.DataContext.Users.SqlQuery(string.Format("SELECT * FROM dbo.Users WHERE LastName like '%{0}%' COLLATE Latin1_general_CI_AI", parameters.SearchTerm)); 

之後,你仍然可以呼籲像計數,排序依據,跳過「查詢」對象的方法等等。

+3

雖然http://www.w3schools.com/sql/sql_injection.asp – youen 2015-10-26 11:11:10

6

設置不區分重音的整理可以解決問題。

您可以使用下一個查詢更改SQL Server和Azure數據庫中列的排序規則。

ALTER TABLE TableName 
ALTER COLUMN ColumnName NVARCHAR (100) 
COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NOT NULL 

SQL_LATIN1_GENERAL_CP1_CI_AI是整理,其中LATIN1_GENERAL是英語(美國),CP1是代碼頁1252,CI不區分大小寫,並且AI是不區分重音。