Question

Quelqu'un a-t-il déjà trouvé un bon moyen d'effectuer des recherches en texte intégral ( FREETEXT () CONTAINS () ) pour un nombre quelconque de mots clés arbitraires à l'aide de la syntaxe de requête LinqToSql standard?

J'aimerais évidemment éviter de devoir utiliser un processus stocké ou de générer des appels SQL dynamiques.

Évidemment, je pourrais simplement pomper la chaîne de recherche d'un paramètre vers un SPROC qui utilise FREETEXT () ou CONTAINS (), mais j'espérais être plus créatif avec la recherche et construire des requêtes telles que:

"Pizza au pepperoni" et burger, pas "tarte aux pommes".

Je suis fou, mais ne serait-il pas intéressant de pouvoir le faire directement à partir de LinqToSql? Tous les conseils sur la manière d’y parvenir seraient très appréciés.

Mise à jour: je pense que je peux être sur quelque chose ici . .

Aussi: j'ai annulé la modification apportée au titre de ma question parce que cela changeait réellement le sens de ce que je demandais. Je sais que la recherche en texte intégral n'est pas prise en charge dans LinqToSql. J'aurais posé cette question si j'avais voulu le savoir. Au lieu de cela, j'ai mis à jour mon titre pour apaiser les masses edit-happy-trigger-fingered.

Était-ce utile?

La solution

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

Je pense qu’il existe de nombreux produits: Lucene.NET, NHibernate Search, me vient à l’esprit. LINQ for NHibernate combiné à NHibernate Search fournirait probablement cette fonctionnalité, mais les deux versions sont encore bien ancrées en version bêta.

Autres conseils

J'ai réussi à résoudre ce problème en utilisant une fonction de valeur table pour encapsuler le composant de recherche de texte intégral, puis je l'ai référencé dans mon expression LINQ en conservant les avantages de l'exécution différée:

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

Ici, "tvf_SearchStories" est la fonction de table qui utilise en interne la recherche de texte intégral

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top