Список сортировки / упорядочения <object>с составными элементами и лямбда-выражениями - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь отсортировать список объектов с составными элементами. Хотя я могу заставить это работать для базовых типов членов (Person.EmployeeName), я не знаю, как увеличить это для составных членов (Person.Employee.CompanyName). Я создаю лямбда-выражение var и отправляю его в Order by.

Редактировать: я должен добавить: это вызывается в методе сортировки GridView. Я реализовал это, используя [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 голосов
/ 18 октября 2011

Я не уверен, что вижу преимущества в том, чтобы сделать это «динамичным», как вы говорите.

Как насчет следующего, который использует дженерики и делегат 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запрос, хотя.

0 голосов
/ 18 октября 2011

По сути, вы просто хотите отсортировать свою коллекцию по Employee.CompanyName, верно? Будет ли работать следующая?

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

Посмотрите на некоторые образцы на 101Linq Samples - этот пример Linq orderby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...