2010-04-30 52 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”的工作...