我已经在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列,用于了解产品是否处于活动状态,是否应该显示。
最好的办法是什么?
1条答案
按热度按时间alen0pnh1#
如果你读了最后一条错误信息,它说
Active
结果中不存在列。如果这是表中的一列,那么Product
模型,则ef将需要它(以及模型的所有其他不可为null的属性)来创建Product
实体。尝试更改sql以启动。。。
…看看能不能帮上忙。