Кто-нибудь придумал хороший способ выполнения полнотекстового поиска (FREETEXT() CONTAINS()) для любого количества произвольных ключевых слов с использованием стандартного синтаксиса запросов LinqToSql?
Я, очевидно, хотел бы избежать использования хранимой процедуры или создания вызовов динамического SQL.
Очевидно, я мог бы просто добавить строку поиска к параметру в SPROC, который использует FREETEXT () или CONTAINS (), но я надеялся проявить более творческий подход к поиску и создать такие запросы, как:
«Пицца пепперони» и бургер, а не «яблочный пирог».
Безумно, я знаю, но было бы здорово сделать это прямо из LinqToSql? Будем очень признательны за любые советы о том, как этого добиться.
Обновление: я думаю, что могу сказать что-то здесь ...
Также: я откатил изменение, внесенное в заголовок моего вопроса, потому что оно фактически изменило смысл того, что я спрашивал. Я знать, что полнотекстовый поиск не поддерживается в LinqToSql - я бы задал этот вопрос, если бы я хотел это знать. Вместо этого - я обновил свое название, чтобы успокоить массы, радостные и радостные.





К сожалению, LINQ to SQL не поддерживает полнотекстовый поиск.
Есть несколько продуктов, которые, я думаю, могут: Lucene.NET, NHibernate Search. LINQ для NHibernate в сочетании с NHibernate Search, вероятно, предоставит эту функциональность, но оба они все еще находятся в стадии бета-тестирования.
Я решил использовать для этого Lucene.NET, и он действительно работает очень хорошо. Теперь мне просто нужно запустить Memcached, и мне вряд ли нужно будет нажимать на БД ;-)
Мне удалось обойти это, используя функцию с табличным значением для инкапсуляции компонента полнотекстового поиска, а затем сослался на него в своем выражении 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 - это табличная функция, которая внутренне использует полнотекстовый поиск.
Привет, Джон, спасибо за это. В принципе, я доволен вашим ответом и знаю, что могу добавить еще один уровень абстракции. Не идеально - с тем же успехом можно написать CONTAINS () SPROC и использовать Linq для всего остального. У меня вопрос: «Можно ли это сделать с помощью Linq»? Если нет, то вашего ответа будет достаточно.