【问题标题】:Create an order-by Expression<Func<T>> with multiple fields创建具有多个字段的 order-by Expression<Func<T>>
【发布时间】:2021-07-04 20:44:33
【问题描述】:
如何创建涉及多个字段的排序表达式?
这不是正确的语法:
Expression<Func<Employee, Object>> orderByExpression = null;
orderByExpression = e => e.LastName || e.FirstName;
_service.GetEmployeesAsync(orderByExpression);
【问题讨论】:
标签:
linq
entity-framework-core
linq-to-entities
entity-framework-5
【解决方案1】:
假设名称是字符串,这应该可以工作:
orderByExpression = e => e.LastName + e.FirstName;
但通过 EF 按多个字段排序的常见模式是将 OrderBy 与以下 1..n ThenBy 调用链接起来,因此可能更明确的方法是将 GetEmployeesAsync 更改为接受 params 表达式作为参数和相应地处理它们。像这样的:
public Task<IEnumerable<Employee>> GetEmployeesAsync(Expression<Func<Employee, object>> orderBy, params Expression<Func<Employee, object>>[] thenBys)
{
IQueryable<Employee> query = ...;
var orderedQuery = query.OrderBy(orderBy);
for (int i = 0; i < thenBys.Length; i++)
{
orderedQuery = orderedQuery.ThenBy(thenBys[i]);
}
...
}
用法如下:
_service.GetEmployeesAsync(x => x.SomeProp, x=> x.SomeOtherProp)