2016-03-04 26 views
0

我遇到了國際符號的數據編碼的問題都在我的本地數據庫(SQL Server 2012)和生產(Azure的SQL)國際字符不是SQL Sever的工作where語句

本來它的發生與實體框架7和Asp5-rc1,但我設法用下面的一個簡單的SQL查詢重現它。

select Source 
from tag 
where Source like '%dzie%' 

返回與ń行正確

顯示dzień.txt

select Source 
from tag 
where Source like '%dzień%' // additional 'ń' character at the end 

返回空表

看起來SQL和實體框架返回值腿它(與ń),但是當我在where語句中使用ń時,數據庫不返回任何結果。

然而,當我執行下面的代碼我Management Studio中

update tag 
set Source = 'dzień.txt' 
where Id = 'my id' 

比這個查詢(同前)

select Source 
from tag 
where Source like '%dzień%' // additional 'ń' character at the end 

這一次返回與ń行正常顯示

dzień.txt

我需要每個角色與where聲明一起使用。我應該怎麼做才能使其工作,特別是在Azure上。

+0

你的LINQ查詢是什麼樣的? –

+0

@KosalaW它很簡單,因爲它可以是'_context.Tags.Where(tag => tag.Source ==「dzień.txt」)'爲了演示我將它轉換爲在SQL中使用'like' – gisek

+0

什麼是整理你的服務器和那個'source'列? – rene

回答

0

試試這個;

_context.Tags.Where(tag => tag.Source.Contains("dzień.txt")) 

這應該將N'添加到SQL查詢中。在執行LINQ時運行SQL Server Profiler並查看它如何將LINQ轉換爲SQL。

另一個選項是Equals運營商。這相當於SQL =運算符。如果你認爲這是具有混合大小寫的名稱的機會,你可以使用CurrentCultureIgnoreCase

_context.Tags.Where(tag => tag.Source.Equals("dzień.txt", StringComparison.CurrentCulture)) 

注意StringComparison.CurrentCulture

請確保您有Source字段的索引。它將顯着提高性能。

更新,以顯示如何查詢商品

這是EF抽籤背上的一個集合。您不能將LINQ to SQL用於非SQL類型的集合。基本上,您的SQL Server中不存在的任何項目集合都被視爲EF未知。

所以這裏是一個選項;

public IENumerable<Tag> SearchTags(IENumerable<string> toBeSearchedTags) 
{ 
    List<Tag> availableTags = new List<Tag>(); 

    foreach(var stag in toBeSearchedTags) 
    { 
     var availableTag = _context.Tags.FirstOrdefault(tag => tag.Source.Equals(stag, StringComparison.CurrentCulture)) 

     if(availableTag != null) 
     { 
      availableTags.Add(availableTag); 
     } 
    } 

    return availableTags; 
} 
+0

謝謝,這個工程。實際上,我必須針對文件名集合運行此查詢,如下所示:'_context.Tags.Where(tag => files.Contains(tag.Source))'你知道我該怎麼做? – gisek

+0

其實Contains方法是由EF實現的,但是我不能用'N'做前綴。您對收藏處理的建議效率非常低。我想我將不得不使用原始SQL這次:) – gisek

+0

您可以使用EF中的存儲過程。對於任何複雜的搜索功能,使用SP更有效,而不是純粹依賴EF(就像我上面提到的那樣)。因此,無論使用什麼ORM,SQL中的知識都非常相關。 –

0

問題是由以下事實ń是一個Unicode字符,而您的字符串文字「%dzień%」未標記爲Unicode字符串引起的。 Unicode字符串由N''前綴標記。

要在Management Studio中進行測試,只需運行

select 'dzień' 

導致dzien。如果將字符串更改爲Unicode,則可將

select N'dzień' 

您得到dzień

請注意,N''-註釋是feature of T-SQL,不需要在探查器或其他日誌記錄中進行區分。

查詢更改爲

select Source 
from tag 
where Source like N'%dzień%' 

,你應該看到期望的結果。

+0

問題不在於sql。 OP需要LINQ幫助 –