Как заказать коллекцию и ее подборку с помощью LINQ? - PullRequest
7 голосов
/ 16 декабря 2010

У меня есть коллекция сотрудников, и у каждого сотрудника есть коллекция обязанностей. Я хотел бы вывести список сотрудников, отсортированных по имени, и вывести их обязанности, отсортированные по названию.

Итак, он должен быть выведен так:


Джейн Джонс

Обязанности:

Ответственность A

Ответственность B

Майк Смит

Обязанности:

Ответственность A

Ответственность C


Для получения начальной коллекции я использую:

var employees = _context.Employees.OrderBy(e => e.Name);

но я не могу понять, как заказать подколлекцию Обязанности также.

Я использую MVC и мой View получает строго типизированную коллекцию Employee, поэтому я не хочу создавать и возвращать анонимный тип.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Вы можете сделать что-то вроде:

var employees = _context.Employees.OrderBy(e => e.Name);
employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name));
3 голосов
/ 16 декабря 2010

1-й подход: ( подходит только для LINQ to Objects с обязанностями, определенными как IList )

Вы можете скопировать в новую коллекцию сотрудников, но это означает, что вам нужно заново скопировать каждое поле в нового сотрудника, что-то вроде этого:

var employees = from e in _context.Employees
                orderby e.Name
                select new Employee
                {
                    Name = e.Name,
                    ...re-assign other properties...
                    Responsibilities = e.Responsibilities.OrderBy(r => r.Name).ToList()
                };

2-й подход:

Использование DataLoadOptions . По сути, вы создаете объект DataLoadOptions, который определяет порядок упорядочения определенных отношений, поэтому в вашем случае:

var options = new DataLoadOptions();
options.AssociateWith<Employees>(e => e.Responsibilities.OrderBy(r => r.Name));
_context.LoadOptions = options;

var employees = _context.Employees.OrderBy(e => e.Name);

Обязанности будут упорядочены автоматически.

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