我正在尝试动态创建一个排序表达式,我给出了要排序的列的名称、排序的方向,并且我知道我要排序的对象类型,但我没有 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/