2011-02-02 162 views
1

我有一个gridview有几列,其中3我想排序。 数据的来源保存在会话中。与动态linq排序gridview

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。”之类的变量来排序变量TheColumn。然后添加基于布尔值的排序方向。我看了OrderBy扩展方法NewDataSource.OrderBy(test);但那也行不通。

我错过了什么让我的代码工作?

谢谢。

回答

1

它看起来像你需要有

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

由于排序依据条款需要一个属性名。该子句不解析字符串以确定如DynamicQueryable那样排序的内容。

或者,在多个领域进行排序的情况下,我会用

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库。我一直在使用它,它是完美的东西我一直在做最近(有一些添加了日期时间?对象的支持)

然后,你可以做这样的事情

NewDataSource = NewDataSource.DynamicOrderBy("ID DESC, Name DESC, Price ASC"); 

爱这个库!

+0

是的,对于一列工程但我想让它适用于所有其他列,并通过接受字符串参数来获得顺序。 OrderBy扩展方法如何工作? – frenchie 2011-02-02 19:07:40

+0

我在这种情况下可能会做的是使用相同的语句,只有没有orderby子句,然后有一个switch语句,它通过参数传入的任何字段来命令它们。我正在编辑我的答案,以显示此... – khr055 2011-02-02 19:13:32

0

您可以使用Dynamic Linq这个表达式:

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