That is precisely something which is demonstrated in "LINQ to Objects Using C# 4.0" by Troy Magennis.
EDIT: Adding example tid-bits and clarification: the author's example is for LINQ to objects rather than LINQ to SQL.  The author simply made an IEqualityComparer, some pieces of which looked like this...
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() );