Полнотекстовый поиск и Entity Framework v1: возможно ли это? - PullRequest
3 голосов
/ 15 декабря 2009

Мы работаем в EFv1, и я реализую элемент управления поиском с несколькими параметрами фильтра. Большинство из них я перевожу в предложения .Where, и это нормально с EF.

Но есть один специальный фильтр, который может заставить мое приложение работать очень медленно: текстовый поиск . Столбец в базе данных имеет соответствующее свойство сущности в моей модели EF, но я просто не могу поместить туда Contains, это плохо для текстового поиска.

Что, по вашему мнению, хорошо использовать в этом случае?

Я слышал о Lucene, я не знаю, интегрируется ли это с EFv1.

Спасибо

Ответы [ 5 ]

1 голос
/ 15 декабря 2009

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

Импортировать хранимые процедуры в EF очень просто, единственная проблема - это составление вызова функции с другими операторами linq. EF v1 не будет делать это на стороне сервера, а это значит, что вы будете выполнять фильтрацию памяти.

Как примечание к другому ответу, вы не можете действительно импортировать функции в EF v1 . Смотрите здесь

1 голос
/ 18 декабря 2009

Я сделал это успешно. Шаги были:

  • Напишите хранимую процедуру, которая выполняет поиск по полнотекстовому индексу.
  • Обновите определение модели («Обновить модель из базы данных» в контекстном меню). Вам нужно будет добавить новую хранимую процедуру
  • Создание импорта функций (в окне «Обозреватель моделей» щелкните правой кнопкой мыши новую сохраненную процедуру и создайте импорт функций). Установите для типа возвращаемого значения соответствующий тип возвращаемого значения (один из ваших объектов).

Затем у вас будет метод, который вы можете вызвать в своем контексте, который вернет EntityCollection <>.

1 голос
/ 15 декабря 2009

Вы можете написать пользовательскую функцию, которая выполняет поиск с помощью полнотекстового поиска, открыть ее для Entity Framework и использовать в C #. Я сделал это для LINQ to SQL, но для EF должно быть то же самое. Пожалуйста, посмотрите на это сообщение в блоге: http://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching.aspx

0 голосов
/ 25 мая 2011

В наши дни в EF4 вы можете сделать что-то вроде этого:

var query = context.ExecuteStoreQuery<Person>(
        "SELECT * FROM People WHERE FREETEXT(*,{0})", 
        searchText
    ).AsQueryable();

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

0 голосов
/ 18 декабря 2009

Lucene.NET не будет напрямую интегрироваться с EF, но вы можете сначала использовать его, чтобы получить список идентификаторов кандидатов в организации, которые затем сможете передать в свой запрос EF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...