Linq zu SQL Soundex - möglich?
-
24-10-2019 - |
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?
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.