Es gibt keine Volltextsuche, die in Linq eingebaut ist, und es scheint nicht viele Beiträge zu diesem Thema zu geben, also habe ich ein wenig herumgespielt und bin auf diese Methode für meine Utlity-Klasse gekommen:
public static IEnumerable<TSource> GenericFullTextSearch<TSource>(string text, MyDataContext context)
{
//Find LINQ Table attribute
object[] info = typeof(TSource).GetCustomAttributes(typeof(System.Data.Linq.Mapping.TableAttribute), true);
//Get table name
String table = (info[0] as System.Data.Linq.Mapping.TableAttribute).Name;
//Full text search on that table
return context.ExecuteQuery<TSource>(String.Concat("SELECT * FROM ", table, " WHERE CONTAINS(*, {0})"), text);
}
Und fügte diesen Wrapper zu jeder partiellen Linq-Klasse hinzu, in der es einen Volltextindex gibt
public static IEnumerable<Pet> FullTextSearch(string text, MyDataContext context)
{
return (LinqUtilities.GenericFullTextSearch<Pet>(text, context) as IEnumerable<Pet>);
}
So kann ich jetzt Volltextsuchen durchführen mit netten Dingen wie
var Pets = Pet.FullTextSearch(helloimatextbox.Text, MyDataContext).Skip(10).Take(10);
Ich gehe davon aus, dass im Moment nur eine sehr einfache Suche notwendig ist. Kann jemand dies verbessern? Ist es möglich, dies als Erweiterungsmethode zu implementieren und den Wrapper zu vermeiden?
4 Stimmen
Ein gefährliches/unoptimales Problem bei Ihrer Abfrage ist, dass .Skip().Take() clientseitig und nicht serverseitig ausgeführt wird. Wenn Sie also eine FTS durchführen, die 10^6 Ergebnisse liefert und Sie nur die ersten 10 haben möchten, werden alle 10^6 von der Datenbank zurückgegeben, und erst dann führen Sie die Filterung durch.
0 Stimmen
Ja, bei einem so großen Datensatz würde ich eine andere Technik in Betracht ziehen ;)
1 Stimmen
Mögliches Duplikat von Ist es möglich, die Volltextsuche (FTS) mit LINQ zu verwenden?