2012-05-05 70 views
0

我正在使用LINQ,而且我有一個數據庫,其中包含用於存儲本地內容(非英文字符)的列。現在,我要讓使用LINQ查詢如下使用LINQ的Unicode字符串的查詢表達式

var desc = from p in db.GetDesc        
      where p.Category.Contains("xxxx".ToString()) 
      orderby p.Date descending 
      select p; 

這裏類別列包含unicode字符串和上面的查詢字符串不工作。我如何在LINQ中使用自然語言查詢?

+0

你能告訴我一些你的* p.Category *文本的例子嗎? – Likurg

+0

GetDesc包含兩列(CatId-int,Category-nvarchar)。因此,p.Category包含諸如Sport,**。**(包括英語和埃塞俄比亞字符)的值。所以,當我在我的linq查詢的WHERE表達式中傳遞Sport時,它會返回有效的結果,但是當我在WHERE clauase中傳遞**ስፖርት**時,它不返回任何內容。 – semytech

+0

您正在使用什麼LINQ提供程序(LINQ to SQL,LINQ to Entities,...)?生成的SQL如何看起來像? – svick

回答

1

一般來說,Unicode應該可以正常使用Linq to SQL和Linq to Entities來對付SQL Server(我假設你使用的是)。其實您的查詢應該是

var desc = from p in db.GetDesc        
      where p.Category.Contains("xxxx") 
      orderby p.Date descending 
      select p; 

有沒有必要使用的ToString(),因爲「XXXX」已經是一個Unicode字符串。

這個問題似乎與SQL Server有關。我試着對包含您的埃塞俄比亞字符的表格進行查詢,正如您所說的那樣,它不起作用。如果我查詢.Contains(「ስፖርት」),則返回全部行。

直接運行SQL具有相同的結果。

嘗試一個簡單的查詢,像這樣的失敗(返回所有行)

select * from TestTable where Title like N'%' + NCHAR(0x1275) + N'%' 

這裏0x1275是ት字符的Unicode代碼點。

如果我們看一下SQL documentation for NCHAR,我們看到只支持高達4000的Unicode代碼點。不幸的是0x1275 = 4725所以它看起來像SQL Server(甚至2012)不會支持埃塞俄比亞字符。

已經讀過4000是限制,測試表明,運行上述簡單查詢與NCHAR(3129)成功(在我的情況下返回沒有行),但> = 3130失敗(返回所有行)。

+0

感謝您的信息。我不知道有限的SQL 2008服務器支持這種埃塞俄比亞字符。我曾經與MySql一起工作,在那裏與這樣的埃塞俄比亞人物一起工作很好。但我不知道爲什麼MS SQL服務器不支持全局Unicode代表。 – semytech

+0

您可能會收到有關MSDN論壇的更多信息。 – Phil