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

Mat*_*ner 7 linq collections

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

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


简琼斯

工作职责:

责任A.

责任B.

迈克史密斯

工作职责:

责任A.

责任C.


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

var employees = _context.Employees.OrderBy(e => e.Name);
Run Code Online (Sandbox Code Playgroud)

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

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

dev*_*tal 5

你可以这样做:

var employees = _context.Employees.OrderBy(e => e.Name);
employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name));
Run Code Online (Sandbox Code Playgroud)


Den*_*vin 3

第一种方法:(适用于职责定义为 IList 的 LINQ to Objects

您可以复制到新的员工集合中,但这意味着您需要将每个字段重新复制到新员工中,如下所示:

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()
                };
Run Code Online (Sandbox Code Playgroud)

第二种方法:

使用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);
Run Code Online (Sandbox Code Playgroud)

责任将自动排序。