如何在ASP.NET Core 3中使用全文索引从数据库中检索产品?

问题描述 投票:2回答:1

我在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 "操作的结果中不存在所需的列 "Active"。

'Active'是products表上的一个bool列,用来知道产品是否处于活动状态,是否应该显示。

请问有什么好办法?

c# sql asp.net-core-3.1 ef-core-3.1
1个回答
1
投票

如果你读了最后一条错误信息,它说的是 Active 列没有出现在结果中。如果那是你的表中的一列,所以是在 Product 模型,那么EF将需要它(以及模型的所有其他非空值属性)来创建这个 Product 实体。

试着改变你的SQL开始...

select st.* from Products st

...看看是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.