c# - 对 ASP.NET 中进一步包含对象的对象列表进行排序

标签 c# asp.net linq sorting gridview

我有一个对象列表,其中还包含对象 例如。

Class Customer{
    string name;
    Address addr;
}

Class Address
{
    string city;
    string state;
}

现在我有一个绑定(bind)到 gridview 的 Customer 对象列表。

| 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);

但是当排序表达式为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; }
}

这里是验证其是否有效的链接 - http://dotnetfiddle.net/iQSTBR

更新1

对于复杂的情况,您需要解析属性,并导航到最后一个属性。我已经更新了代码,这里是使用子属性的示例 - http://dotnetfiddle.net/alTWPK

更新2

 var selectedNew = selected
       .AsQueryable<Customer>()
       .OrderBy(sortExpression)
       .ToList();
 gdvEmployees.DataSource = selectedNew; 
 gdvEmployees.DataBind(); 

关于c# - 对 ASP.NET 中进一步包含对象的对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20772233/

相关文章:

c# - BitArray 改变范围内的位

c# - 如何在代码、c#、wp7中访问应用程序资源

c# - 只选择一个时间间隔内的第一条记录

c# - 在 C# 中更改字体样式(粗体、斜体、粗斜体)

c# - 如何向现有 IQueryable 添加多个选择

c# - ASP.NET 用户模拟

c# - 我如何在 SilverLight 中组合一些用户控件?

asp.net - 在部署时编译 ASCX 文件而不是首次加载?

c# - 如何在 C# 中过滤包含另一个列表的列表?

c# - 使用 LINQ 集合中的条件更新字符串