创建具有多个字段的 order-by Expression<Func<T>>

问题描述

如何创建涉及多个字段的 order-by 表达式?

这不是正确的语法:

Expression<Func<Employee,Object>> orderByExpression = null;
orderByExpression = e => e.LastName || e.FirstName;

_service.GetEmployeesAsync(orderByExpression);

解决方法

假设名称是字符串,这应该可以工作:

orderByExpression = e => e.LastName + e.FirstName;

但是通过 EF 按多个字段排序的常见模式是将 OrderBy 与以下 1..n ThenBy 调用链接起来,因此可能更清晰的方法是将 GetEmployeesAsync 更改为接受 { {1}} 表达式作为参数并相应地处理它们。像这样:

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]);
    }
    ...
}