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());
Para aquellos que intentaron con versiones más nuevas: (y para mi futura referencia) [DbFunction ("SqlServer", "SOUNDEX")] –