Я создал полнотекстовый индекс для моей таблицы Products на SQL сервере. Я пытаюсь найти лучший способ получить эти продукты (во время поиска) в порядке их ранжирования.
Следующий SQL показывает продукты в порядке ранжирования:
select ID, k.rank, Name from Products st
inner join freetexttable(Products, Name, 'orange fanta') as k on st.ID=k.[key]
order by rank desc
Я пробовал использовать метод EntityFramework EF.Functions.FreeText()
, он не упорядочивает их по рангу.
Я пробовал использовать FromRaw Sql:
products = _appDbContext.Set<Product>().FromSqlRaw("select ID, k.rank, Name from Products st inner join freetexttable(Products, Name, '{0}') as k on st.ID = k.[key] order by rank desc", currentFilter);
Это вызывает следующую ошибку:
SqlException: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указаны TOP, OFFSET или FOR XML.
После поиска, общая причина этой ошибки, похоже, заключается в использовании order by
, вложенного в другой select
, здесь не так.
Я пробовал вызвать хранимую процедуру, которая была создана с использованием этот код:
products = _appDbContext.Set<Product>().FromSqlRaw("FreeTextSearch {0}", currentFilter);
, но появляется эта ошибка:
InvalidOperationException: FromSqlRaw или FromSqlInterpolated были вызваны с несоставным SQL и с запросом, составляющим его. Рассмотрите возможность вызова AsEnumerable
после метода FromSqlRaw или FromSqlInterpolated для выполнения композиции на стороне клиента.
Я попытался добавить AsEnumerable
в конец, но получил сообщение об ошибке:
InvalidOperationException: обязательный столбец «Активный» отсутствовал в результатах операции «От Sql».
«Активный» - это столбец типа bool в таблице продуктов, чтобы узнать, продукт активен и должен отображаться или нет.
Как лучше всего go сообщить об этом?