我对此进行了一些研究,并在StackOverflow和一些博客文章中查看了一些文章,但没有找到确切的答案。我还读到可以使用4.0框架来完成它,但还没有找到任何支持证据。
所以我的问题是,是否可以通过LINQ to SQL Query执行SOUNDEX?
答案 0 :(得分:21)
您可以使用假UDF在数据库中执行此操作;在部分类中,向数据上下文添加方法:
[DbFunction(Name = "SoundEx", IsComposable = true)]
public string SoundsLike(string input)
{
throw new NotImplementedException();
}
您可以使用如下表达式:
x => db.SoundsLike(x.QuoteValue) == db.SoundsLike("text")
最初的想法来自: Random row from Linq to Sql
答案 1 :(得分:6)
添加如下的udf
CREATE FUNCTION [dbo].[udfSoundex]
(
@Soundex nvarchar(100)
)
RETURNS nvarchar(100)
AS
BEGIN
RETURN Soundex(@Soundex)
END
只需将它从服务器资源管理器拖到visual studio dbml文件中的数据上下文中,并在代码中将其用作在datacontext类上公开的方法。
答案 2 :(得分:4)
从.net 4开始,这也会起作用:
from p in mytable
where SqlFunctions.SoundCode(p.MyRow) == SqlFunctions.SoundCode("test")
select p
此处有更多信息:http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.soundcode.aspx
答案 3 :(得分:2)
这正是特洛伊·马根尼斯在“LINQ to Objects Using C# 4.0”中所展示的内容。
编辑:添加示例tid-bits和澄清:作者的示例是LINQ to objects而不是LINQ to SQL。作者简单地制作了一个IEqualityComparer,其中一些看起来像这样......
public class SoundexEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return GetHashCode(x) == GetHashCode(y);
}
public int GetHashCode(string obj)
{
//e.g. convert soundex code A123,
//to an integer: 65123
int result = 0;
string s = soundex(obj);
if (string.IsNullOrEmpty(s) == false)
result = Convert.ToInt32(s[0]) * 1000 +
Convert.ToInt32(s.Substring(1, 3));
return result;
}
private string soundex(string s)
{
//e.g. book's implementation omitted for this post.
}
}
//example usage (assuming an array of strings in "names")
var q = names.GroupBy(s => s, new SoundexEqualityComparer() );
答案 4 :(得分:0)
在SQL Server上,您可以将SOUNDEX包装在UDF(用户定义的函数)中。您可以将它添加到DataContext类,然后您应该能够通过DataContext使用它。
答案 5 :(得分:0)
您还可以使用SqlFucntions.Difference方法,该方法映射到Soundex函数:
SqlFunctions.Difference(string,string)返回int - 返回值越高,字符串越“相似”。