使用动态linq排序gridview

时间:2011-02-02 18:45:53

标签: c# asp.net

我有一个包含多个列的gridview,其中3个我想要排序。 数据源保存在会话中。

protected void MyGridHistorySort(object sender, GridViewSortEventArgs e)
{
    var TheColumn = (e.SortExpression).ToString();

    TheDataHistory = (List<ViewDataHistoryModel>)Session["SessionDataHistory"];

    var test = "data.DataDate";

    var NewDataSource = from data in TheDataHistory
                    orderby test
                    select data;

    MyGridHistory.DataSource = NewDataSource;
    MyGridHistory.DataBind();

DataDate是列表中的有效列,但orderby语句不起作用。理想情况下,我希望通过编写类似test =“data。”+ TheColum的内容来对变量TheColumn进行排序。然后根据布尔值添加排序方向。我查看了OrderBy扩展方法NewDataSource.OrderBy(test);但这也不起作用。

我缺少什么让我的代码工作?

感谢。

3 个答案:

答案 0 :(得分:1)

看起来你需要

var NewDataSource = from data in TheDataHistory
                    orderby data.DataDate
                    select data;

由于orderby子句采用属性名称。该子句不解析字符串以确定要像Dynamic Queryable那样订购什么。

或者,在多个字段上排序的情况下,我会使用

var NewDataSource = from data in TheDataHistory
                    select data;

switch(fieldToSortOn)
{
  case "field1":
    NewDataSource = NewDataSource.OrderBy(x => x.Field1);
    break;
  case "field2":
    NewDataSource = NewDataSource.OrderBy(x => x.Field2);
    break;

  ...

}

如果您真的只想使用字符串对其进行排序,那么我会完全推荐Dynamic Queryable库。我一直在使用它,它最适合我最近一直在做的事情(有一些额外支持DateTime?对象)

然后你可以做像

这样的事情
NewDataSource = NewDataSource.DynamicOrderBy("ID DESC, Name DESC, Price ASC");

喜欢这个图书馆!

答案 1 :(得分:0)

您可以对此表达式使用Dynamic Linq

string sortExpression = "ContactName DESC";     
var x1 = context     
    .Customers    
    .OrderBy(sortExpression);

答案 2 :(得分:0)

复制粘贴我的答案中的代码并将Select更改为OrderBy并将动态更改为T;) How to make the position of a LINQ Query SELECT variable