C# 排序在ASP.NET中进一步包含对象的对象列表
我有一个对象列表,其中还有对象 例如 现在我有了一个绑定到gridview的Customer对象列表C# 排序在ASP.NET中进一步包含对象的对象列表,c#,asp.net,linq,sorting,gridview,C#,Asp.net,Linq,Sorting,Gridview,我有一个对象列表,其中还有对象 例如 现在我有了一个绑定到gridview的Customer对象列表 | Name | city | State | 我想根据城市和州对gridview列进行排序。 我该怎么做呢 我试过了 var param = Expression.Parameter(typeof(Customer), e.SortExpression); var sortExpression = Expression.Lambda<Func<Customer, object&g
| Name | city | State |
我想根据城市和州对gridview列进行排序。
我该怎么做呢
我试过了
var param = Expression.Parameter(typeof(Customer), e.SortExpression);
var sortExpression = Expression.Lambda<Func<Customer, object>>(
Expression.Convert(Expression.Property(param, e.SortExpression),typeof(object)), param);
var param=Expression.Parameter(typeof(Customer),例如SortExpression);
var sortExpression=Expression.Lambda(
Expression.Convert(Expression.Property(param,e.SortExpression),typeof(object)),param);
但当排序表达式为city时,它不会排序。以下是我的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
public class Program
{
public static void Main()
{
var list = new List<Customer>();
list.Add(new Customer()
{
FirstName = "ztest",
LastName = "ztest1",
Address = new Address()
{
City = "Kiev"
}
});
list.Add(new Customer()
{
FirstName = "test",
LastName = "test1",
Address = new Address()
{
City = "New York"
}
});
string sortExpressionField = "Address.City";
var props = sortExpressionField.Split('.');
var inParam = Expression.Parameter(typeof(Customer));
var param = props.Aggregate<string, Expression>(inParam, Expression.Property);
var sortExpression = Expression.Lambda<Func<Customer, object>>(param, inParam);
var sorted = list.AsQueryable<Customer>().OrderBy(sortExpression);
foreach (var item in sorted)
{
Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
}
}
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string City { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
公共课程
{
公共静态void Main()
{
var list=新列表();
列表。添加(新客户()
{
FirstName=“ztest”,
LastName=“ztest1”,
地址=新地址()
{
城市=“基辅”
}
});
列表。添加(新客户()
{
FirstName=“test”,
LastName=“test1”,
地址=新地址()
{
城市=“纽约”
}
});
字符串sortExpressionField=“Address.City”;
var props=sortExpressionField.Split('.');
var inParam=Expression.Parameter(typeof(Customer));
var param=props.Aggregate(inParam,Expression.Property);
var sortExpression=Expression.Lambda(param,inParam);
var sorted=list.AsQueryable().OrderBy(sortExpression);
foreach(已排序的变量项)
{
Console.WriteLine(“{0}{1}”,item.FirstName,item.LastName);
}
}
}
公共类客户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共广播地址{get;set;}
}
公共课堂演讲
{
公共字符串City{get;set;}
}
以下是验证其是否有效的链接-
更新1
对于复杂的情况,您需要解析属性,并导航到最后一个属性。我已经更新了代码,下面是使用子属性的示例-
更新2
var selectedNew = selected
.AsQueryable<Customer>()
.OrderBy(sortExpression)
.ToList();
gdvEmployees.DataSource = selectedNew;
gdvEmployees.DataBind();
var selectedNew=selected
.AsQueryable()
.OrderBy(sortExpression)
.ToList();
gdveemployees.DataSource=selectedNew;
gdveEmployees.DataBind();
这是我正在使用的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
public class Program
{
public static void Main()
{
var list = new List<Customer>();
list.Add(new Customer()
{
FirstName = "ztest",
LastName = "ztest1",
Address = new Address()
{
City = "Kiev"
}
});
list.Add(new Customer()
{
FirstName = "test",
LastName = "test1",
Address = new Address()
{
City = "New York"
}
});
string sortExpressionField = "Address.City";
var props = sortExpressionField.Split('.');
var inParam = Expression.Parameter(typeof(Customer));
var param = props.Aggregate<string, Expression>(inParam, Expression.Property);
var sortExpression = Expression.Lambda<Func<Customer, object>>(param, inParam);
var sorted = list.AsQueryable<Customer>().OrderBy(sortExpression);
foreach (var item in sorted)
{
Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
}
}
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string City { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
公共课程
{
公共静态void Main()
{
var list=新列表();
列表。添加(新客户()
{
FirstName=“ztest”,
LastName=“ztest1”,
地址=新地址()
{
城市=“基辅”
}
});
列表。添加(新客户()
{
FirstName=“test”,
LastName=“test1”,
地址=新地址()
{
城市=“纽约”
}
});
字符串sortExpressionField=“Address.City”;
var props=sortExpressionField.Split('.');
var inParam=Expression.Parameter(typeof(Customer));
var param=props.Aggregate(inParam,Expression.Property);
var sortExpression=Expression.Lambda(param,inParam);
var sorted=list.AsQueryable().OrderBy(sortExpression);
foreach(已排序的变量项)
{
Console.WriteLine(“{0}{1}”,item.FirstName,item.LastName);
}
}
}
公共类客户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共广播地址{get;set;}
}
公共课堂演讲
{
公共字符串City{get;set;}
}
以下是验证其是否有效的链接-
更新1
对于复杂的情况,您需要解析属性,并导航到最后一个属性。我已经更新了代码,下面是使用子属性的示例-
更新2
var selectedNew = selected
.AsQueryable<Customer>()
.OrderBy(sortExpression)
.ToList();
gdvEmployees.DataSource = selectedNew;
gdvEmployees.DataBind();
var selectedNew=selected
.AsQueryable()
.OrderBy(sortExpression)
.ToList();
gdveemployees.DataSource=selectedNew;
gdveEmployees.DataBind();
您想在绑定到GridView之前对其进行排序吗?为什么不使用list.OrderBy(c=>c.City)?我想在gridview排序事件中对其排序您想在绑定到gridview之前对其排序吗?为什么不使用list.OrderBy(c=>c.City)?我想在gridview排序事件上对其进行排序当排序表达式是类的成员时,它可以正常工作,但当排序表达式是类的成员时,它不工作。我的意思是,当这个类进一步拥有另一个类的对象时,我正在对这个成员进行排序。就像地址类的城市字段。还有一个问题。现在,如果我将这个“var sorted”绑定到启用了分页功能的gridview,它会说“数据源不支持服务器端分页”,您可以帮我解决这个问题吗?您可以尝试调用sorted.ToList(),它将获取所有项并将它们转换为常用的列表。var selectedNew=selected.AsQueryable().OrderBy(sortExpression);选择new.ToList();gdveemployees.DataSource=selectedNew;gdveEmployees.DataBind();仍然提出同样的问题,这是行不通的。当您调用ToList时,它将返回新的列表项。然后你应该把它保存在某个变量中,然后使用它。我已经根据您的代码使用示例更新了答案。当排序表达式是类的成员时,它可以正常工作,但当排序表达式是类的成员时,它不工作。我的意思是,当这个类进一步拥有另一个类的对象时,我正在对这个成员进行排序。就像地址类的城市字段。还有一个问题。现在,如果我将这个“var sorted”绑定到启用了分页功能的gridview,它会说“数据源不支持服务器端分页”,您能帮我解决这个问题吗?您可以尝试调用sorted.ToList(),它将获取所有项并转换