Frage

Ich habe ein wenig nachgeforscht und habe ein paar Artikel sowohl hier auf Stackoverflow als auch einige Blog -Posts durchgesehen, aber keine genaue Antwort gefunden. Ich habe auch gelesen, dass es möglich ist, es mit dem 4.0 -Framework zu tun, aber noch keine unterstützenden Beweise zu finden.

Meine Frage, ist es also möglich, SoundEx über eine LINQ zu SQL -Abfrage auszuführen?

War es hilfreich?

Lösung

Sie können dies in der Datenbank tun, indem Sie einen gefälschten UDF verwenden. Fügen Sie in einer Teilklasse dem Datenkontext eine Methode hinzu:

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

Sie können als Ausdruck wie:

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

Erste Idee von:Zufällige Zeile von Linq zu SQL

Andere Tipps

Fügen Sie eine UDF wie unten hinzu

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

Ziehen Sie es einfach von Server Explorer in den Datenkontext in der Visual Studio DBML -Datei und verwenden Sie es in Code als Methode, die in Ihrer DataContext -Klasse aufgeführt ist.

Da .NET 4 auch funktioniert:

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

Weitere Informationen hier: http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.soundcode.aspx

Das ist genau das, was in "demonstriert wird"Linq zu Objekten mit C# 4.0"Von Troy Magennis.

Bearbeiten: Hinzufügen von Beispiel-TID-Bits und Klärung: Das Beispiel des Autors ist für LINQ zu Objekten und nicht für LINQ zu SQL. Der Autor machte einfach einen iEqualityComparer, von denen einige so aussahen ...

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

Auf dem SQL-Server können Sie SoundEx in eine UDF (Benutzerdefinierte Funktion) einwickeln. Sie können dies zu Ihrer DataContext -Klasse hinzufügen, und dann sollten Sie es über den DataContext verwenden können.

Sie können auch die Methode SQLFucntions.Difference verwenden, die der SoundEx -Funktion ordnet:

SQLFunctions.Difference (String, String) gibt int int zurück - Je höher der Rückgabewert, desto mehr "ähnlich" sind die Zeichenfolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top