Recherche plein Texte dans Linq

Il n'y a pas de recherche de texte intégral construit en Linq et il ne semble pas y avoir beaucoup de posts sur le sujet donc j'ai eu un jouer et est venu avec cette méthode pour mon utlity classe:

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

Et a ajouté ce wrapper pour chaque partiel Linq classe où il y a un index de texte intégral

public static IEnumerable<Pet> FullTextSearch(string text, MyDataContext context)
{
    return (LinqUtilities.GenericFullTextSearch<Pet>(text, context) as IEnumerable<Pet>);
}

Alors maintenant, je peux faire une recherche plein texte avec des trucs sympa comme

var Pets = Pet.FullTextSearch(helloimatextbox.Text, MyDataContext).Skip(10).Take(10);

Je suis en supposant que seulement une recherche de base est nécessaire à l'heure actuelle. Quelqu'un peut-il améliorer cette situation? Est-il possible de mettre en œuvre une méthode d'extension et d'éviter le wrapper?

  • Un dangereux/unoptimal question concernant votre requête, c'est que l' .Skip().Prendre() sera exécuté côté client, pas serverside. Donc, si vous faites un FTS qui renvoie 10^6 résultats et vous voulez juste les 10 premiers, tous les 10^6 d'entre eux sera retourné à partir de la base de données, et alors seulement vous effectuer le filtrage.
  • Aye, sur un jeu de données que grand je voudrais être envisager une autre technique 😉
  • Double Possible de Est-il possible d'utiliser de la Recherche Plein Texte (FTS) avec LINQ?