如何使用LINQ订购集合及其子集合?

时间:2010-12-15 22:40:17

标签: linq collections

我有一组员工,每个员工都有一系列职责。我想输出按名称排序的员工列表,并输出他们的职责,按标题排序。

所以,它应该像这样输出:


Jane Jones

职责:

责任A

责任B

迈克史密斯

职责:

责任A

责任C


要获得我使用的初始集合:

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

但我似乎无法弄清楚如何订购责任子集。

我正在使用MVC,我的View收到一个强类型的Employee集合,因此我不想构建并返回匿名类型。

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

var employees = _context.Employees.OrderBy(e => e.Name);
employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name));

答案 1 :(得分:3)

第一种方法:仅适用于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);

责任将自动订购。