2010-06-07 31 views
10

Investigué un poco sobre esto y revisé algunos artículos tanto aquí en StackOverflow como en algunas publicaciones de blog, pero no encontré una respuesta exacta. También leí que es posible hacerlo utilizando el marco 4.0, pero aún no he encontrado ninguna evidencia de respaldo.LINQ to SQL SOUNDEX - posible?

Entonces mi pregunta, ¿es posible realizar SOUNDEX a través de un LINQ to SQL Query?

Respuesta

20

Puede hacer esto en la base de datos, utilizando un UDF falso; en una clase parcial, añadir un método para el contexto de datos:

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

se puede utilizar como una expresión como:

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

idea inicial de: Random row from Linq to Sql

+2

Para aquellos que intentaron con versiones más nuevas: (y para mi futura referencia) [DbFunction ("SqlServer", "SOUNDEX")] –

2

Eso es precisamente algo que se demuestra en "LINQ to Objects Using C# 4.0" por Troy Magennis.

EDITAR: Agregar ejemplos de tid-bits y aclaración: el ejemplo del autor es para LINQ a objetos en lugar de LINQ a SQL. El autor simplemente hizo una IEqualityComparer, algunas piezas de las que se veía así ...

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

Y para aquellos que no tienen el libro, ¿tiene un ejemplo? –

+2

Aunque le agradezco la respuesta a Mystagogue, un ejemplo o un enlace a un ejemplo sería más beneficioso que un enlace a un libro que puedo comprar. –

0

En el servidor SQL Server, se puede envolver en una SOUNDEX UDF (función definida por el usuario). Puede agregar eso a su clase DataContext, y luego debería poder usarlo a través del DataContext.

+0

¿Sería capaz de dar un ejemplo de esto, por favor? –

5

Añadir una UDF como a continuación

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

basta con arrastrar desde el Explorador de servidor en contexto en el que los datos en el archivo de estudio dbml visual y lo utilizan en código como un método expuesto en su clase DataContext ..

4

Desde este .net 4 funcionará así:

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

Más información aquí: http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.soundcode.aspx

+1

Esto parece ser una referencia a Entity Framework y NOT Linq a SQL que explica por qué no hay votos positivos. – jpierson

+0

@jpierson Cierto, mi mal. Pero encontré esta pregunta buscando una solución de EF, por lo que tal vez ayude a alguien. – Marthijn

0

También puede utilizar el método SqlFucntions.Difference, que asigna a la función Soundex:

SqlFunctions.Difference (String, String) int - cuanto mayor sea el valor de retorno, los más "similares" las cuerdas son.

+0

Esto es EF, no Linq a SQL. –