Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排序在ASP.NET中进一步包含对象的对象列表_C#_Asp.net_Linq_Sorting_Gridview - Fatal编程技术网

C# 排序在ASP.NET中进一步包含对象的对象列表

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

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

现在我有了一个绑定到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);
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(),它将获取所有项并转换