LINQ to SQL SOUNDEX - возможно?
Я немного поработал над этим и просмотрел несколько статей как на StackOverflow, так и на некоторых сообщениях в блогах, но не нашел точного ответа. Я также читал, что это можно сделать с использованием рамки 4.0, но пока не найти никаких подтверждающих доказательств.
Итак, мой вопрос: возможно ли выполнить SOUNDEX с помощью запроса LINQ to SQL?
Ответы
Ответ 1
Вы можете сделать это в базе данных, используя поддельный UDF; в частичном классе добавьте метод в контекст данных:
[DbFunction(Name = "SoundEx", IsComposable = true)]
public string SoundsLike(string input)
{
throw new NotImplementedException();
}
Вы можете использовать в качестве выражения, например:
x => db.SoundsLike(x.QuoteValue) == db.SoundsLike("text")
Исходная идея от:
Случайная строка от Linq до Sql
Ответ 2
Добавьте udf, как показано ниже
CREATE FUNCTION [dbo].[udfSoundex]
(
@Soundex nvarchar(100)
)
RETURNS nvarchar(100)
AS
BEGIN
RETURN Soundex(@Soundex)
END
Просто перетащите его из проводника сервера в контекст данных в файле dbml visual studio и используйте его в коде как метод, открытый в вашем классе datacontext.
Ответ 3
Так как .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
Ответ 4
Это как раз то, что показано в "" LINQ to Objects using С# 4.0" Трой Магенис.
EDIT: добавление примера tid-bits и пояснения: пример автора предназначен для LINQ для объектов, а не 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 implementation omitted for this post.
}
}
//example usage (assuming an array of strings in "names")
var q = names.GroupBy(s => s, new SoundexEqualityComparer() );
Ответ 5
На SQL Server вы можете обернуть SOUNDEX в UDF (пользовательская функция). Вы можете добавить это в свой класс DataContext, а затем вы сможете использовать его через DataContext.
Ответ 6
Вы также можете использовать метод SqlFucntions.Difference, который сопоставляется с функцией Soundex:
SqlFunctions.Difference(string, string) возвращает int - чем выше возвращаемое значение, тем больше "похоже" строк.