我有一个标准的 ASP.NET MVC 3 控制器,其操作具有以下签名:
public ActionResult Index(int? page, string sort, string sortDir)
我的视图正在使用 WebGrid,因此它会自动生成参数。
接下来我使用动态表达式 API(又名动态 LINQ)将参数转换为查询。例子:
var customerSummary = CustomerManager.CustomerRepository.GetQuery()
.OrderBy(sort + " " + sortDir)
.Select(c => new CustomerSummaryViewModel()
{
Id = c.Id,
Name = c.Name,
IsActive = c.IsActive,
OrderCount = c.Orders.Count
})
.Skip(page.Value - 1 * 10) //10 is page size
.Take(10)
.ToList();
目标
我想做的是使用动态表达式 API本身来验证用于排序的参数(并可能创建一个有效的 lambda)。例如,我想使用DynamicExpression.Parse()
orDynamicExpression.ParseLambda()
方法来查看它们是否产生ParseException
,在这种情况下,我可以用默认值替换错误的参数(例如按名称升序“名称 ASC”排序)...
问题
问题是IQueryable
扩展只接受一个字符串如果我想使用ParseLambda
然后将它提供给.OrderBy
我不能使用方向(它只接受属性名称)。例如,我可以这样做:
var se = DynamicExpression.ParseLambda<Customer, string>("Name"); // now I can use .OrderBy(se) which is same as .OrderBy(c=>c.Name)
但不是这个
var se = DynamicExpression.ParseLambda<Customer, string>("Name DESC");
回顾
我想使用动态 LINQ 来 1)验证和 2)基于操作参数构建谓词(用于排序)