c# - 按未选择的列排序

标签 c# linq entity-framework-core contains containstable

我正在尝试使用 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");

但我有一个异常(exception):

"Rank" is not a member of type "Customer"

这是真的。有什么方法可以对不在实体上的列进行排序,还是我需要创建一个 MyCustomerSearchQuery 查询对象并使用 AutoMapper 将它们转换为 Customer?我宁愿不这样做,因为 Customer 有很多属性,保持这些属性同步会很麻烦。

提前致谢!

最佳答案

你可以试试

 query = query.OrderBy(x => x.Rank);

 query = query.OrderBy(x => x["Rank"]);

关于c# - 按未选择的列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58656891/

相关文章:

linq - 如何使用 TypeScript 在 linq 查询中创建匿名类型

c# - 优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类

c# - 如果可能,将多个 if 条件合并为单个 LINQ 语句

c# - 部署使用 Entity Framework Core 的 WPF 应用程序

c# - XmlSerializer 反序列化返回空数组

javascript - 响应后调用提醒。结束

c# - IUserStore`1 类型没有可访问的构造函数

c# - ASP.NET MVC 单点登录和角色

c# - 是否可以使用带有内部连接的 ef core 5 运行原始 sql 并将数据具体化为一个类?

c# - DbContext 实例同时在两个地方使用 - EF - Hangfire