Как я могу получить продукты из базы данных с полнотекстовым индексом в ASP. NET Core 3 - PullRequest
2 голосов
/ 26 мая 2020

Я создал полнотекстовый индекс для моей таблицы 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 сообщить об этом?

1 Ответ

1 голос
/ 26 мая 2020

Если вы читали это последнее сообщение об ошибке, в нем говорится, что столбец Active не присутствовал в результатах. Если это столбец в вашей таблице и, следовательно, свойство в модели Product, то он понадобится EF (и всем другим свойствам модели, не допускающим значения NULL) для создания сущностей Product.

Попробуйте изменить SQL, чтобы начать ...

select st.* from Products st

... и посмотрите, поможет ли это.

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