我有一个包含多个列的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);但这也不起作用。
我缺少什么让我的代码工作?
感谢。
答案 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