在参数中使用字段名称命令IList

时间:2010-01-12 06:43:09

标签: c# linq lambda

我有这段简单的代码

public ActionResult ListToGrid(string field, string direction)
{
    _model.MyList = _repo.List();
}

要排序,我可以这样做:

_model.MyList = _employeeService.List().OrderBy(x => x.FirstName).ToList<Employee>();

但是我想在参数中使用“as field”作为名称接收(字段)以及收到的方向。

谢谢,

2 个答案:

答案 0 :(得分:2)

你可以使用反射,但那会很慢。最有效的方法是声明要在排序中使用的委托,并根据字符串分配函数:

Func<Employee,string> order;
switch (field) {
   case "FirstName": order = x => x.FristName;
   case "LastName": order = x => x.LastName;
}

对于方向,我认为最好只使用单独的代码:

var list = _employeeService.List();
IEnumerable<employee> sorted;
if (direction == "ascending") {
   sorted = list.OrderBy(order);
} else {
   sorted = list.OrderByDescending(order);
}
_model.List = sorted.ToList<Employee>();

答案 1 :(得分:1)

搜索谈论动态LINQ表达式的网站。例如,这个显示了如何进行动态排序:

http://blogs.sftsrc.com/stuart/archive/2009/02/19/130.aspx

您还可以根据方向参数选择是否拨打OrderByOrderByDescending