2011-04-01 74 views
0

幫我搜索LINQ中的UNICODE值,當我編寫一個LINQ來搜索一個不是UNICODE的字符串時,它工作正常,但字符串是UNICODE,我的查詢沒有搜出任何東西。LINQ如何搜索UNICODE值

Menus.Where(e => e.Name.ToLower().Contains(keyword.ToLower())) 
    .OrderBy(e => e.Order) 
    .ThenBy(e => e.Name) 
    .ToList(); 

它很好地工作沒有Unicode字符串像

"AMERICAN BREAFAST: CHOICE OF FRIED EGG OR OMELETE SERVED WITH CRISPY BACON, SAUSAGE, SAUTEED TOMATO AND TOAST" 

但是當我搜索一個Unicode字符串像

"Bữa ăn sáng kiểu Mỹ: chọn giữa trứng chiên hoặc trứng cuộn dùng kèm thịt xông khói, xúc xích, cà chua xào và bánh mì nướng" 

它不工作了。請幫我修復它。非常感謝

+0

我沒有得到相同的結果。顯然,這裏缺少一些上下文,但如果我調用第二個string.Contains(「v」),它將返回true。 「菜單」枚舉中的每個「菜單」選項的上下文均已丟失。 – Tejs 2011-04-01 18:22:00

+0

C#中的字符串通常是unicode。你是否從數據庫或文件或類似的字符串中得到字符串?然後看看你使用的編碼,當你閱讀文本 – 2011-04-01 19:32:25

回答

2

首先,您提供的英文字符串實際上是Unicode。

其次,這一類的問題,對這個問題的根源幾種可能的軌跡:

  1. 哪裏「關鍵字」從何而來?它是否從源編碼正確轉換爲Unicode?例如,如果數據來自ASP.Net應用程序,則需要確保HTML Meta Content-Type標記爲「text/html; charset = UTF-8」,並且服務器的請求和響應編碼爲也違約UTF-8。如果你可以在調試器中查看這個變量,關鍵字,沒有問題,那麼你可能沒問題。
  2. 底層數據源中e.Name的類型是什麼?如果它在SQL Server上,它是NVARCHAR還是VARCHAR?如果它是VARCHAR,排序規則是否映射到支持越南語的合適編碼?
  3. 無論NVARCHAR或VARCHAR如何,基礎排序規則還包含區分大小寫規則。如果您的字段使用區分大小寫的歸類,您的toLower調用可能會導致意外的結果,因爲它不符合數據庫中的歸類規則。此外,該字段的歸類指定比較是否區分重音或不區分變音,這可能會影響您的結果。
  4. 在某些情況下,Unicode規範化表單可能會影響您的結果。因爲越南語可以用組合字符或分解字母+變音代碼點表示,所以應確保規範化是一致的。例如,根據您的偏好,您可能會發現最好將其編碼爲unicode kC或kD格式,但應始終如此。
+0

感謝球員,我正在修復它。 – NevenHuynh 2011-04-03 14:35:57

0

我無法重現您的問題,但有可能因爲string.Contains使用序數文化進行比較,所以錯誤地匹配某些字符。您可能需要將您的Where子句更改爲Where(e => e.IndexOf(keyword,StringComparison.CurrentCultureIgnoreCase)>=0)以避免文化問題。