如何使用GroupBy()分组多个项目?

Ahm*_*mad 6 c# linq group-by

考虑以下简化对象和关系:

public class Job{
  int JobId;
  String name;
  String status;
  Discipline disc;
  WorkCategory workCat;
}

public class Discipline {
  int DisciplineId;
  String DisciplineName;
}

public class Workcategory{
   int WorkCategoryId;
   String WorkCategoryName;
}

public Class Grouping{
   Discipline parent;
   List<Workcategory> children;
}
Run Code Online (Sandbox Code Playgroud)

上面描述了a Job与一个Discipline和一个相关联的关系WorkCategory.的Workcategory始终是一个特定的父母的孩子Discipline(一个一对多的关系).我们可以假设指定的Discipline和Workcategory的关系始终有效.

我面临的问题是当我尝试Grouping基于应用的过滤器创建结果对象时Jobs.我不确定如果可以做到这一点,或者我采取的方法是否正确.确切的问题本身并不清楚,但上面定义了问题陈述.

  1. 设计可以改进吗?
  2. 如何按学科和工作类别对作业进行分组?
  3. 我甚至需要Grouping上课吗?

我尝试了以下(这是我第一次尝试使用Linq),但没有成功,因为我的理解不够完整.另一种方法是首先获取Discipline组并循环通过原始分组拾取相关的Workcategory.

var grouping = repository.GetJobsWithActiveStatus()
            .GroupBy(x => new {
                                  x.Discipline.DisciplineID, 
                                  x.Discipline.DisciplineName,  
                                  x.Category.WorkCategoryID, 
                                  x.Category.WorkCategoryName
                              })
            .Select(g => new Grouping{
                                 Discipline = new Discipline{
                                                  DisciplineID = g.Key.DisciplineID, 
                                                  Name = g.Key.DisciplineName
                                                  }, 
                                 Categories = ?? // this is where I am lost
                             }});
Run Code Online (Sandbox Code Playgroud)

编辑:发布后,我意识到初始GroupBy参数导致一组项目,而我正在寻找Group-SubGroup结果.

编辑2:为了进一步澄清,我不希望相关的工作作为结果的一部分,而是将Discipline-Workcategory分组 - 因此是Grouping课程的原因


基于@Obalix的初始解决方案

编辑2010年3月7日:

此解决方案不起作用 - 对象Discipline上的GroupBy将为每个对象生成唯一的分组.我认为这是因为它是一种参考类型.我对么?我最初接受这个作为答案,但是经过一些头脑的抓挠后发现我的模拟数据本身就是错误的.最初的问题仍然存在.

var result = repository.GetJobsWithActiveStatus()
      .GroupBy(x => x.disc)
      .Select(g => new Grouping
              {
                  Discipline = g.Key,
                  Catergories = g.GroupBy(x=>x.workCat) // <--- The Problem is here, grouping on a reference type
                                 .Select(l=>l.Key) // needed to select the Key's only
                                 .ToList()
              });
Run Code Online (Sandbox Code Playgroud)

Axe*_*ger 2

以下描述了如何实现分层分组机制。

使用 LINQ 执行此操作的通用方法(如链接中所示)是:

var list = new List<Job>();

var groupedList = list.GroupBy(x => x.disc)
    .Select(g => new {
        Key = g.Key,
        Count = g.Count(),
        WorkCategoryGroups = g.GroupBy(x => x.workCat)
    });
Run Code Online (Sandbox Code Playgroud)

但是,该链接还描述了另一种方法,允许您执行以下操作:

var groupedList = list.GroupByMany(x => x.disc, x => x.workCat);
Run Code Online (Sandbox Code Playgroud)

编辑:以下艾哈迈德的评论是强类型版本:

var groupedList = list.GroupBy(x => x.disc)
    .Select(g => new Grouping {
        parent = g.Key,
        children = g.GroupBy(x => x.workCat).ToList()
    });
Run Code Online (Sandbox Code Playgroud)