如何使用LINQ对集合及其子集进行排序?

8
我有一个员工集合,每个员工都有一组职责。我想按姓名排序输出员工列表,并输出他们的职责,按职责名称排序。
因此,输出应该像这样:

Jane Jones

职责:

职责A

职责B

Mike Smith

职责:

职责A

职责C


要获取初始集合,请使用:
var employees = _context.Employees.OrderBy(e => e.Name);

但是我似乎无法弄清楚如何对Responsibilities子集合进行排序。

我正在使用MVC,我的视图接收一个强类型的Employee集合,所以我不想构建并返回匿名类型。


我决定在从数据库中提取集合时不对其进行排序。从技术上讲,排序是演示的一部分,因此我现在在视图中执行它(我正在使用MVC)。当我对employee.Responsibilities进行foreach循环时,我现在对子集合进行排序。 - Matt Penner
以后参考起来会很有帮助,知道如何做这件事会很好。谢谢! - Matt Penner
我已经添加了第二种方法。抱歉,这也很繁重。我认为没有更简单的方法,所以我同意你的观点 - 最好在视图中进行排序或创建一些特殊的DTO(数据传输对象),并对其进行投影,然后将其传递到视图,而不是Employee。 - Denis Ivin
2个回答

5
你可以这样做:

你可以像这样做:

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

1
当我尝试这样做时,我会收到错误信息:无法将源类型IOrderedEnumerable<>转换为目标类型EntityCollection<>。 - Matt Penner
对我来说起作用了。我不确定这是对于我的特定情况最好的方法,但现在我会坚持使用它。 - Jeroen
对于那些遇到“无法将源类型IOrderedEnumerable<>转换为目标类型EntityCollection<>”错误的人,你只需要将其转换为列表,如下所示:employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name).ToList()); - Sudarshan_SMD

3

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

您可以将其复制到新的Employee集合中,但这意味着您需要重新将每个字段复制到新的Employee中,就像这样:

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);

责任将自动排序。

我也认为每个字段重新复制是浪费时间。实际上,当我尝试这样做时,我会收到一个错误,告诉我无法将IQueryable对象转换为EntityCollection。所以这对我来说行不通。 - Matt Penner
是的,它需要转换为EntitySet而不是List。此外,您不能在查询中创建新的Employee,因为L2S不允许这样做,因此在您的情况下似乎只能使用第二个选项。 - Denis Ivin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接