2008-09-15 6 views
5

Est-ce que quelqu'un a trouvé un bon moyen d'effectuer des recherches de texte intégral (FREETEXT() CONTAINS()) pour n'importe quel nombre de mots-clés arbitraires en utilisant la syntaxe de requête LinqToSql standard?LinqToSql et recherche de texte intégral - est-ce possible?

Je voudrais évidemment éviter d'avoir à utiliser un processus stocké ou devoir générer un appel SQL dynamique.

Il est évident que je pourrais simplement pomper la chaîne de recherche sur un paramètre à une procédure stockée qui utilise FREETEXT() ou contains(), mais j'espérais être plus créatif avec la recherche et de construire des requêtes telles que:

"pizza au pepperoni" et burger, pas "tarte aux pommes". Fou je sais - mais ne serait-il pas propre d'être en mesure de le faire directement à partir de LinqToSql? Tous les conseils sur la façon d'y parvenir seraient très appréciés.

Mise à jour: Je pense que je peux être à quelque chose here ...

aussi: Je révulsés la modification apportée à mon titre de la question, car il réellement changé le sens de ce que je demandais. I sais que la recherche en texte intégral n'est pas supportée par LinqToSql - j'aurais posé cette question si je voulais savoir cela. Au lieu de cela, j'ai mis à jour mon titre pour apaiser les masses edit-happy-trigger-fingered.

Répondre

4

Malheureusement, LINQ to SQL ne prend pas en charge la recherche de texte intégral.

Il y a un tas de produits là-bas que je pense pourrait: Lucene.NET, NHibernate Search vient à l'esprit. LINQ pour NHibernate combiné avec NHibernate Search donnerait probablement cette fonctionnalité, mais les deux sont encore très profonds en version bêta.

+0

Hey Jon, merci pour cela. Je suis heureux de votre réponse en principe et je suis conscient que je pourrais ajouter une autre couche d'abstraction. Pas idéal - écrire aussi CONTAINS() SPROC et utiliser Linq pour chaque signe. Ma question est "Peut-on utiliser Linq"? Si non, alors votre réponse suffira. – RobertTheGrey

+0

J'ai décidé d'utiliser Lucene.NET pour ça maintenant et ça marche plutôt bien. Maintenant j'ai juste besoin de faire fonctionner Memcached et je n'aurai presque plus besoin de cliquer sur la BD ;-) – RobertTheGrey

5

J'ai réussi à contourner ce problème en utilisant une fonction d'une valeur de table pour encapsuler le composant de recherche en texte intégral, il est fait référence dans mon expression LINQ maintenir les avantages de l'exécution tardive:

string q = query.Query; 
IQueryable<Story> stories = ActiveStories 
         .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o) 
         .Where (s => (query.CategoryIds.Contains(s.CategoryId)) && 
            /* time frame filter */ 
           (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) && 
           (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value))); 

Voici tvf_SearchStories 'est la fonction de valeur de table qui utilise en interne la recherche plein texte

Questions connexes