LINQ to SQL SOUNDEX - possibile?
-
24-10-2019 - |
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?
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