Как получить продукты из базы данных с помощью полнотекстового индекса в ASP.NET Core 3

Я создал полнотекстовый индекс для своей таблицы Products в SQL Server. Я пытаюсь найти лучший способ получить эти продукты (во время поиска) в порядке их ранжирования.

Следующий 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(), он не упорядочивает их по рангу.

Я пробовал использовать FromRawSql:

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: обязательный столбец «Активный» отсутствовал в результатах операции «FromSql».

«Активный» - это столбец типа bool в таблице продуктов, чтобы узнать, активен ли продукт и должен ли он отображаться.

Как лучше всего это сделать?


person aryeh    schedule 25.05.2020    source источник
comment
Как объясняется в документации, FromSqlRaw() завершает ваш запрос в SELECT [entity properties] FROM (yourquery) ORDER BY. Почему бы вам не спросить о проблеме, которую вы действительно хотите решить, которая, по-видимому, заключается в упорядочивании запроса объекта по его рангу в свободном тексте, и о том, что вы пытались сделать для этого?   -  person CodeCaster    schedule 26.05.2020
comment
@CodeCaster Мне кажется, что OP на самом деле ясно дал понять, что он пытается создать поиск по произвольному тексту с рангом (см. Запрос в начале), а также показывает много попыток.   -  person Pac0    schedule 26.05.2020
comment
@CodeCaster в SQL порядок работает нормально, моя цель - заставить его работать в Visual Studio с использованием EF Core   -  person aryeh    schedule 26.05.2020


Ответы (1)


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

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

select st.* from Products st

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

person Avrohom Yisroel    schedule 25.05.2020