我在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列,用来知道产品是否处于活动状态,是否应该显示。
请问有什么好办法?
如果你读了最后一条错误信息,它说的是 Active
列没有出现在结果中。如果那是你的表中的一列,所以是在 Product
模型,那么EF将需要它(以及模型的所有其他非空值属性)来创建这个 Product
实体。
试着改变你的SQL开始...
select st.* from Products st
...看看是否有帮助。