Sql Server Freetext через структуру Entity Framework

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

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

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

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

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

Какой лучший способ для этого сделать?

Ответ 1

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

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

string sql = "DO FULLTEXT STUFF";
MyObjectContext.ExecuteStoreQuery<MyEntity>(sql, .......);

Ответ 2

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

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

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

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