2010-12-15 2 views
6

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

Таким образом, он должен быть выведен так:


Джейн Джонс

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

ОТВЕТСТВЕННОСТЬ

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

Mike Smith

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

ОТВЕТСТВЕННОСТЬ

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


Чтобы получить первоначальную коллекцию я использую:

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

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

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

+0

Я решил не заказывать colelction, когда я достаю его из базы данных. Техническое упорядочение является частью презентации, поэтому я теперь делаю это в представлении (я использую MVC). Теперь я заказываю суб-коллекцию, когда я делаю foreach над сотрудником. Ответственность. – 2010-12-15 23:51:11

+0

Было бы неплохо узнать, как это сделать для дальнейшего использования. Благодаря! – 2010-12-15 23:51:28

+0

Я добавил второй подход ... Извините, это тоже очень тяжело. Я не думаю, что есть более простой способ, поэтому я согласен с вами - было бы гораздо лучше сделать заказ в представлении или создать специальный DTO (объект передачи данных) и сделать проекцию в него, а затем перейти к представлению вместо Работника. – 2010-12-16 01:54:08

ответ

2

первый подход: (подходит только для LINQ к объектам с обязанностями, определенными в 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() 
       }; 

второго подход:

Использование 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); 

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

3

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

var employees = _context.Employees.OrderBy(e => e.Name); 
employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name)); 
Смежные вопросы