Linq - 获取与字段的音译值进行比较

4

我有一张表(SQL Server),其中一个列('Name')包含西里尔文值。

我收到的参数值中,包含了这个字段但是是转换后的拼音形式。

例如:'Вася' -> '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))
3个回答

2
我从未见过“CTransliteration.Transliterate”-我是否正确地认为这来自您自己的软件/第三方库?
针对DataContext的Linq查询被转换为SQL,然后在SQL Server上执行。您无法以SQL表达要运行的查询:CTransliteration.Transliterate不是SQL语言的一部分。
我认为有两种方法可以解决: a)将查询拆分为在SQL Server上运行的部分,并在.NET中进行转译。对于您列出的SELECT,这不是问题:
m_DataContext.Table
 .ToList()
 .Select(r => r.name=CTransliteration.Transliterate(r.Name));

对于WHERE子句来说,这样做选择不佳,因为您需要将所有内容传输到应用程序服务器,然后进行过滤。

b) 将转换功能移入SQL Server中的CLR函数,并通过SQL而非Linq运行查询。


1

我用了2个Linq查询解决了这个问题。

  1. 我创建了一个新的小类:

    public class SmallClass { public int Id { get; set; } public String Name { get; set; } }

然后我实现了下面的逻辑:

...

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;

它正在工作中...


1

你可以尝试使用 string.Compare(r.Name, "你的值", CultureInfo.xxx, CompareOptions.xxx),或许会有更好的运行结果?


很遗憾,没有。有一种按字母的特殊音译算法。它将西里尔字母转换为用于URL的slug。 - Maxim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接