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?
Vous devez vous connecter pour publier un commentaire.
La plus élégante solution est d'utiliser une ligne de table d'une valeur de la fonction en sql et l'ajouter à votre modèle
http://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching.aspx
J'ai été assez frustré par le manque de clarté des exemples... surtout quand il y a potentiellement de grands ensembles de données et d'échange est nécessaire. Donc, voici un exemple qui nous l'espérons comprend tout ce dont vous pourriez avoir besoin 🙂
Profiter,
Patrick
J'utilise un petit hack en utilisant Fournisseur De Wrapper techniques. J'ai un code c# qui réécrire mot magique dans SQL avec des FTS de recherche pour MS SQL (vous pouvez l'ajuster pour n'importe quel serveur vous voulez).
si vous avez contexte de la classe MyEntities, créer des sous-classe comme
Et ensuite l'utiliser comme ceci:
Un peu plus agréable à la méthode (prend rang dans l'effet) à l'aide de CONTAINSTABLE
J'ai essayé de résoudre le problème exact. J'aime écrire mes SQL logique dans ma LINQtoSQL mais j'ai besoin d'un moyen de faire de la Recherche Plein Texte. droit maintenant, je suis juste en utilisant des fonctions SQL et puis en appelant les fonctions définies par l'utilisateur directement dans les requêtes linq. vous ne savez pas si c'est la façon la plus efficace. qu'avez-vous pensez?
Vous pouvez tout simplement faire quelque chose comme ceci
Avis, où TagName.Contient également le SQLMethods.Comme il suffit de faire une utilisation
pour avoir accès à ce SQLMethods.
LIKE
n'est pas unFULLTEXT
de recherche.dswatik - la raison pour vouloir de recherche de texte intégral est que .contient se traduit par
Qui ignore tout des index et des est horrible sur une grande table.