Entity Framework, полнотекстовый поиск и временные таблицы - PullRequest
4 голосов
/ 18 сентября 2009

У меня есть построитель запросов LINQ-2-Entity, который вкладывает различные типы предложений Where в зависимости от довольно сложной формы поиска. Прекрасно работает до сих пор.

Теперь мне нужно использовать индекс полнотекстового поиска SQL Server в некоторых моих запросах. Есть ли возможность добавить критерий поиска непосредственно в запрос LINQ и получить оценку в виде выбираемого свойства?

Если нет, я мог бы написать хранимую процедуру для загрузки списка всех идентификаторов строк, соответствующих критериям полнотекстового поиска, а затем использовать запрос LINQ-2-Entity для загрузки подробных данных и оценки других необязательных критериев фильтрации в цикле в строке. Это, конечно, очень плохая идея с точки зрения производительности.

Другой вариант - использовать хранимую процедуру для вставки всех идентификаторов строк, соответствующих полнотекстовому поиску, во временную таблицу, а затем разрешить запросу LINQ присоединиться к временной таблице. Вопрос: как объединить временную таблицу в запросе LINQ, поскольку она не может быть частью модели сущностей?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

Думаю, я бы предложил гибридный подход.

  1. Напишите хранимую процедуру, которая возвращает всю необходимую вам информацию.
  2. Сопоставить объект с результатами. Сущность может быть создана для этой единственной цели. Альтернативно, используйте версию 4 Entity Framework, которая позволяет отображать сложные типы для запуска результатов процедуры. Дело в том, что вместо того, чтобы пытаться привести результаты процедуры к существующим типам сущностей, собирались обрабатывать их как свои собственные типы.
  3. Теперь вы можете создать запрос LINQ to Entities.

Пример запроса:

var q = from r in Context.SearchFor("searchText")
        let fooInstance = (r.ResultType == "Foo")
            ? Context.Foos.Where(f => f.Id == r.Id)
            : null
        where ((fooInstance == null) || (fooInstance.SpecialCriterion == r.SpecialCriterion))    
        select {
            // ...

Это не в моей голове, поэтому синтаксис может быть неправильным. Важным моментом является обработка результатов поиска как объекта.

Альтернативно: используйте более гибкую систему FTS, которая может выполнять «специальную» фильтрацию для каждого типа при построении индекса.

1 голос
/ 25 мая 2011

Я видел такой код для EF4:

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

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

...