Sql Server Freetext через Entity Framework - PullRequest
10 голосов
/ 06 мая 2011

У меня есть существующий веб-сайт, разработанный с использованием ASP.NET MVC 3 и Entity Framework 4, запрашивающий базу данных Sql Server 2008.Он содержит форму поиска с примерно 10 полями, и когда пользователь нажимает кнопку отправки, я динамически создаю запрос Entity SQL, содержащий только указанные поля поиска, пропуская пустые.Оно работает.Пока все хорошо.

Теперь клиенту требуется поведение полнотекстового поиска для одного из полей.Я считаю этот запрос довольно сложным, потому что (AFAIK):

  • Entity Framework изначально не поддерживает полнотекстовый поиск
  • Я хочу избегать хранимых процедур для переноса синтаксиса FTS, потому что такДо сих пор я использовал только «статические» SP, сохраняя логику в коде .NET.Поэтому я хочу попытаться избежать построения запроса внутри процедуры.И создание одной процедуры для каждой возможной комбинации полей поиска не вариант.

Решения, о которых я мог подумать:

  • Размещение хранимой процедуры или пользовательской функции какпоиск предиката в предложении WHERE (хотя я не уверен, что это возможно)
  • Получение результатов FTS отдельно во временной таблице и выполнение других фильтров для этой временной таблицы.Я боюсь плохой работы, если есть много результатов FTS с этой техникой ...

Как лучше всего справиться с этим?

Ответы [ 2 ]

6 голосов
/ 07 мая 2011

Разве вы не можете просто использовать raw sql? тогда вы можете сохранить логику в вашем .NET-коде.

Итак, это будет выглядеть примерно так:

string sql = "DO FULLTEXT STUFF";
MyObjectContext.ExecuteStoreQuery<MyEntity>(sql, .......);
1 голос
/ 06 мая 2011

Вам не нужно думать о производительности - это все равно будет медленным, потому что вы замените индексированный полнотекстовый поиск на стандартное сравнение строк по объединенному значению.

Существует три способа:

  • Динамически создайте запрос ESQL, как вы делаете сейчас, но используйте LIKE для объединенного значения ваших столбцов
  • Определяемая пользователем функция SQL или Определяемая моделью функция для оценки проверки поиска, импортированной вмодель EDMX и открыт для запросов Linq-to-entity.
  • Вместо поиска в таблице используйте прямой просмотр с вычисляемым столбцом (содержащим все десять полей) и запустите «полный текст» для этого столбца.

Любой из этих методов не является решением для производительности.

...