使用复合成员和Lambda表达式</object>对List <object>进行排序/排序

时间:2011-10-18 15:48:54

标签: c# .net linq lambda

我正在尝试使用复合成员对对象列表进行排序。虽然我可以使用它来为成员基本类型(Person.EmployeeName)工作,但我不知道如何为复合成员(Person.Employee.CompanyName)刺穿它。我正在创建一个Lambda Expression var,并将其发送到Order by。

编辑:我应该添加:这是在GridView Sort方法上调用的。我确实使用[If(e.SortExpression ==“Employee.CompanyName”){... OrderBy(.. Employee.CompanyName)}]实现了这个,但是(我的老板)建议保持这种动态。

public class Company {
    public string CompanyName;
}
public class Person {
    public Company Employee;
    public string EmployeeName;
}

public void LinqExpressionTest() {
    // Create List of people with Employeers
    List<Person> people = new List<Person>();
    people.Add(new Person() { Employee = new Company { CompanyName = "Apple" } });
    people.Add(new Person() { Employee = new Company { CompanyName = "Microsoft" } });

    // Create Linq Lambda expression for sort based on Person.Employee.CompanyName
    // Error on next line because "Employee.CompanyName" is 'not defined for type Expression.Property'
    var param = Expression.Parameter(typeof(Person), "Employee.CompanyName"); 
    Expression linqExpression = Expression.Property(param, "Employee.CompanyName");
    UnaryExpression unaryExpression = Expression.Convert(linqExpression, typeof(object));
    var sortExpression = Expression.Lambda<Func<Person, object>>(unaryExpression, param);

    var sortedPeople = people.AsQueryable<Person>().OrderBy(sortExpression).ToList();
}

2 个答案:

答案 0 :(得分:-1)

基本上你只想按Employee.CompanyName对你的收藏进行排序吗?以下是否有效?

var sortedList = (from person in people
                 orderby person.Employee.CompanyName
                 select person).ToList()

看看101Linq Samples处的一些样本 - 这是Linq orderby的一个例子。

答案 1 :(得分:-1)

我不确定如你所说,我认为让这种“充满活力”的好处。

以下使用泛型和Func委托的情况如何 - 看起来有点极端但我不知道它是否会起作用 - 我刚刚接受了我之前的查询并创建了一个传入密钥的方法您想通过以下方式订购列表:

    public IEnumerable<TSource> OrderList<TSource, TKey>(
        IEnumerable<TSource> list, 
        Func<TSource, TKey> sortFunction)
    {
        return from element in list
               orderby sortFunction
               select element;
    }

然后你会这样称呼:

OrderList<Person, string>(people, (x)=>(x.Employee.CompanyName));

我没有看到使用它而不是Linq查询的好处。