LINQ to SQL SOUNDEX - возможно? - PullRequest
10 голосов
/ 08 июня 2010

Я провел небольшое исследование по этому вопросу и просмотрел несколько статей, как здесь, в StackOverflow, так и некоторые сообщения в блоге, но не нашел точного ответа. Я также читал, что это можно сделать с помощью платформы 4.0, но пока не найдено каких-либо подтверждающих доказательств.

Итак, мой вопрос, возможно ли выполнить SOUNDEX через LINQ to SQL Query?

Ответы [ 6 ]

21 голосов
/ 09 июня 2010

Вы можете сделать это в базе данных, используя поддельный UDF; в частичном классе добавьте метод в контекст данных:

[DbFunction(Name = "SoundEx", IsComposable = true)]
public string SoundsLike(string input)
{
    throw new NotImplementedException();
}

Вы можете использовать в качестве выражения как:

x => db.SoundsLike(x.QuoteValue) == db.SoundsLike("text")

Первоначальная идея от: Случайная строка от Linq до Sql

6 голосов
/ 08 июня 2010

Добавьте udf, как показано ниже

CREATE FUNCTION [dbo].[udfSoundex]
(
    @Soundex nvarchar(100)
)
RETURNS nvarchar(100)
AS
BEGIN
    RETURN Soundex(@Soundex)
END

Просто перетащите его из обозревателя серверов в контекст данных в файле dbml visual studio и используйте его в коде как метод, представленный в вашем классе данных datacontext.*

4 голосов
/ 08 мая 2013

Начиная с .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

2 голосов
/ 08 июня 2010

Это именно то, что продемонстрировано в « LINQ к объектам с использованием C # 4.0 » Троя Магенниса.

РЕДАКТИРОВАТЬ: Добавление примеров и пояснений: авторский пример для LINQ к объектам, а не LINQ для 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() );
0 голосов
/ 02 августа 2013

Вы также можете использовать метод SqlFucntions.Difference, который отображается на функцию Soundex:

SqlFunctions.Difference (string, string) возвращает int - чем больше возвращаемое значение, тем более «похожими» являются строки.

0 голосов
/ 08 июня 2010

На SQL Server вы можете заключить SOUNDEX в UDF (пользовательскую функцию). Вы можете добавить это в свой класс DataContext, и тогда вы сможете использовать его через DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...