2008-09-15 8 views
5

Кто-нибудь придумал хороший способ выполнения полнотекстового поиска (FREETEXT() CONTAINS()) для любого количества произвольных ключевых слов, используя стандартный синтаксис запроса LinqToSql?LinqToSql и полнотекстовый поиск - это можно сделать?

Я, очевидно, хотел бы избежать использования хранимого Proc или должен генерировать вызовы Dynamic SQL.

Очевидно, что я мог бы просто накачать строку поиска в от параметра к SPROC, который использует FREETEXT() или СОДЕРЖИТ(), но я надеялся быть более творческим с поиском и создать запросы, как:

«pepperoni pizza» и гамбургер, а не «яблочный пирог».

Сумасшедший Я знаю - но разве это не было бы возможно сделать это прямо из LinqToSql? Любые советы о том, как достичь этого, будут высоко оценены.

Обновление: Я думаю, что может быть на что-то here ...

Кроме того: я откатил изменения, сделанные в моем названии вопроса, потому что он на самом деле изменил смысл того, что я просил. I знаю, что полнотекстовый поиск не поддерживается в LinqToSql - я бы задал этот вопрос, если бы я хотел это знать. Вместо этого я обновил свой заголовок, чтобы успокоить массы с правым правым эффектом.

ответ

4

К сожалению, LINQ to SQL не поддерживает полнотекстовый поиск.

Есть куча продуктов, которые, я думаю, могут: Lucene.NET, NHibernate Search приходит на ум. LINQ для NHibernate в сочетании с NHibernate Search, вероятно, предоставит эту функциональность, но оба они по-прежнему глубоко в бета-версии.

+0

Эй, Джон, спасибо за это. Я доволен своим ответом в принципе и понимаю, что я мог бы добавить еще один слой абстракции. Не идеальный вариант - может также написать CONTAINS() SPROC и использовать Linq для любого другого. Мой вопрос: «Можно ли это сделать с помощью Linq»? Если нет, тогда вашего ответа будет достаточно. – RobertTheGrey 2008-09-16 08:24:35

5

Я сумел обойти эту проблему с помощью таблицы функции инкапсулировать полнотекстовой поиск компонент, а затем ссылается его в моем выражении LINQ сохраняя преимущества отсроченного исполнения:

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

Вот tvf_SearchStories 'является табличной функцией, которая внутренне использует полнотекстовый поиск

Смежные вопросы