Domanda

Ho fatto un po 'di ricerca su questo e guardato attraverso alcuni articoli sia qui su StackOverflow così come alcuni post del blog, ma non hanno trovato una risposta esatta. Ho anche letto che è possibile farlo utilizzando il framework 4.0, ma non hanno ancora trovato alcuna prova a sostegno.

Quindi la mia domanda, è possibile l'esecuzione SOUNDEX tramite una query LINQ to SQL?

È stato utile?

Soluzione

Si può fare questo alla base di dati, utilizzando un UDF falso; in una classe parziale, aggiungere un metodo per il contesto dati:

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

È possibile utilizzare come espressione del tipo:

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

idea iniziale da: a caso fila da LINQ to SQL

Altri suggerimenti

Aggiungi un'UDF come di seguito

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

È sufficiente trascinare da Esplora server su di te contesto dati nel file Studio dbml visiva e usarlo nel codice come un metodo esposto sulla tua classe DataContext ..

Dal .net 4 questo funzionerà così:

from p in mytable
where SqlFunctions.SoundCode(p.MyRow) == SqlFunctions.SoundCode("test")
select p

Più informazioni su: http: //msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.soundcode.aspx

Questa è proprio una cosa che è dimostrato in " LINQ to Objects con C # 4.0 " di Troy Magennis.

EDIT: Aggiunta esempio bocconcini e chiarimenti: esempio l'autore è per LINQ di oggetti piuttosto che LINQ to SQL. L'autore semplicemente fatto un IEqualityComparer, alcuni pezzi dei quali si presentava così ...

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() );

In SQL Server, si può avvolgere SOUNDEX in un UDF (User-Defined Function). Si può aggiungere che alla classe DataContext, e allora si dovrebbe essere in grado di usarlo attraverso il DataContext.

È inoltre possibile utilizzare il metodo SqlFucntions.Difference, che associa alla funzione Soundex:

SqlFunctions.Difference (String, String) restituisce Int. - più alto è il valore di ritorno, il più "simile" le stringhe sono

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top