如何在asp.net core 3中使用全文索引从数据库检索产品

ddarikpa  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(473)

我已经在sqlserver中的products表上创建了一个全文索引。我试图找到最好的方式来检索这些产品(在搜索过程中)的排名顺序。
以下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:使用不可组合的sql调用了fromsqlraw或fromsqlinterpolated,并在其上组合了一个查询。考虑打电话 AsEnumerable 在fromsqlraw或fromsqlinterpolated方法之后,在客户端执行合成。
我试着添加 AsEnumerable 到最后,但得到一个错误:
invalidoperationexception:“fromsql”操作的结果中不存在必需的列“active”。
“active”是products表上的bool列,用于了解产品是否处于活动状态,是否应该显示。
最好的办法是什么?

alen0pnh

alen0pnh1#

如果你读了最后一条错误信息,它说 Active 结果中不存在列。如果这是表中的一列,那么 Product 模型,则ef将需要它(以及模型的所有其他不可为null的属性)来创建 Product 实体。
尝试更改sql以启动。。。

select st.* from Products st

…看看能不能帮上忙。

相关问题