2010-04-30 57 views
4

我有一個表(sql server)。其中一列('姓名')包含西里爾文的值。Linq - 與字段的音譯值比較

從參數我收到的價值,包含在這個領域,但是音譯。

我的意思是這樣的:'Вася' - >'Vasya'。我需要首先音譯價值領域;

var q = from r in m_DataContext.Table where CTransliteration.Transliterate(r.Name).Contains(trans_text) select r; 

m_DataContext.Table.Select(r => r.name=CTransliteration.Transliterate(r.Name)) 

回答

2

我從來沒有見過「CTransliteration .Transliterate「 - 我是否認爲這是來自您自己的軟件/第三方庫?

您在DataContext上定位的Linq查詢被轉換爲SQL,然後在SQL Server上執行。您無法表達您希望在SQL中運行的查詢:CTransliteration.Transliterate不是SQL語言的一部分。

我認爲有兩種方法可以去: a)將查詢拆分爲在SQL Server上運行的部分,並在.NET中進行音譯。對於選擇您所列出的,這不是一個問題:

m_DataContext.Table 
.ToList() 
.Select(r => r.name=CTransliteration.Transliterate(r.Name)); 

對於WHERE子句,這使得一個貧窮的選擇,因爲你需要的一切傳遞給應用服務器,然後執行過濾。

b)將音譯功能移入SQL Server中的CLR函數,並通過SQL運行查詢,而不是Linq。

1

您可能會發現更多的運氣與string.Compare(r.Name, "Your Value", CultureInfo.xxx, CompareOptions.xxx)

+0

不幸的是,沒有。 有一個字母特殊的音譯算法。它從西里爾文的價值轉化爲url的slu g – Maxim 2010-04-30 09:10:43

1

我解決了2 LINQ查詢。

  1. 我創建了一個新的小類

    公共類小類 { 公衆詮釋標識{獲得;組; } public String Name {get;組; }}

後,我實現下一個邏輯:

...

var q = from r in GetAllTable() select new SmallClass{ Id = r.ID, Name = CTransliteration.Transliterae(r.Name)) }; 


var rr = from r in q where r.Name.Contains(trans_text) select r; 

I'T」的工作...