c# - 如何创建用于动态排序的表达式

标签 c#

我正在尝试动态创建一个排序表达式,我给出了要排序的列的名称、排序的方向,并且我知道我要排序的对象类型,但我没有 IQueryable 或任何东西。

这是我想出的函数,但语法错误:

    private static Expression<Func<Opportunity, Object>> AddSortExpression(string sortOrder)
    {
        Func<Opportunity, Object> func;
        switch (sortOrder)
        {
            case "DATE_CREATED":
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderBy(x => x.DATE_CREATED_UTC);
                break;
            case "DATE_CREATED_DESC":
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderByDescending(x => x.DATE_CREATED_UTC);
                break;
            case "FORECAST_CLOSE_DATE":
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderByDescending(x => x.FORECAST_CLOSE_DATE);
                break;
            case "RESPONSIBLE_USER":
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderBy(x => x.RESPONSIBLE_USER_ID);
                break;
            case "PIPELINE_STAGE":
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderBy(x => x.PIPELINE_ID);
                break;
            default:
                func = Expression.Lambda<Func<Opportunity, Object>>().OrderBy(x => x.OPPORTUNITY_NAME);
                break;
        }
        return Expression.Lambda<Func<Opportunity, Object>>(Expression.Call(func.Method));
    }

正确的语法是什么?

最佳答案

没有理由不能将可查询传递给您的方法并应用适当的 orderby 调用。

private static IOrderedQueryable<Opportunity> AddSortExpression(IQueryable<Opportunity> source, OpportunitySortOrder sortOrder)
{
    switch (sortOrder)
    {
    case OpportunitySortOrder.DateCreated:
        return source.OrderBy(x => x.DATE_CREATED_UTC);
    case OpportunitySortOrder.DateCreatedDesc:
        return source.OrderByDescending(x => x.DATE_CREATED_UTC);
    case OpportunitySortOrder.ForecastCloseDate:
        return source.OrderByDescending(x => x.FORECAST_CLOSE_DATE);
    case OpportunitySortOrder.ResponsibleUser:
        return source.OrderBy(x => x.RESPONSIBLE_USER_ID);
    case OpportunitySortOrder.PipelineStage:
        return source.OrderBy(x => x.PIPELINE_ID);
    case OpportunitySortOrder.Name:
    default:
        return source.OrderBy(x => x.OPPORTUNITY_NAME);
    }
}

关于c# - 如何创建用于动态排序的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448204/

相关文章:

c# - 打开 XML : How to add rows and cell value after appending new sheet in existing Excel file using c#

c# - C# 中的双泛型类型

c# - Unity - 在 Update() 上减少/增加 "Z axis"角度轴

c# - 在 Startup 的 Configure 方法中注入(inject) cancellation-token

c# - c# win apps 中的用户控制和数据绑定(bind)

c# - 如何添加动态文本作为任务栏图标覆盖?

c# - DataTable.Load(FbDataReader) 不会将所有内容加载到 DataTable

c# - 如果父应用程序未释放互斥锁对象会发生什么

c# - 避免或修复 .Net Core 中的 namespace 污染

c# - LinqToXml 的优化