【发布时间】:2020-02-27 14:42:32
【问题描述】:
我正在尝试使用 SQL 运算符 CONTAINSTABLE 来获取搜索结果列表,如下所示:
SELECT c.*, ccontains.[RANK]
FROM Customers c
INNER JOIN CONTAINSTABLE(Customers, LastName, @searchTerm) ccontains ON c.Id = ccontains.[KEY]
并从 EF Core 2.1 调用此函数:
var query = DbContext.Customers.FromSql("SELECT * FROM udfSearchCustomers(@searchTerm)",
new SqlParameter(@searchTerm, mySearchTerm));
query = query.Include(c => c.Addresses).Take(maxResults);
我想按RANK 降序排列我的搜索结果,以便在顶部获得最相关的结果。不允许将ORDER BY ccontains.[RANK] 添加到我的函数中,因为我的SELECT * FROM udfSearchCustomers(...) 将被EF Core 包装:内部查询中不允许ORDER BY。无法添加query.OrderBy(c => c.Rank),因为RANK 不在Customer 实体上。
我已经尝试使用System.Linq.Dynamic 以及其他反射解决方案来做到这一点:
query = query.OrderBy("Rank");
但我有一个例外:
“排名”不是“客户”类型的成员
这是真的。有没有办法对不在实体上的列进行排序,或者我需要创建一个MyCustomerSearchQuery 查询对象并使用 AutoMapper 将它们转换为Customer?我宁愿不这样做,因为Customer 有很多属性,要让它们保持同步会很麻烦。
提前致谢!
【问题讨论】:
标签: c# linq entity-framework-core contains containstable