考虑以下简化的对象和关系:
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;
}
上面的模型展示了一个关系,即一个
Job
与一个 Discipline
和一个 WorkCategory
相关联。 Workcategory
总是作为特定父 Discipline
的子代(一对多关系)。 我们可以假设分配的学科和工作类别的关系始终有效。我遇到的问题是,当我尝试根据应用于
Jobs
的过滤器创建 Grouping
结果对象时。我不确定这是否可以完成,或者我所采取的方法是否正确。确切的问题本身对我来说不太清楚,但是上述定义了问题陈述。
- 设计能否改进?
- 如何按学科和工作类别对工作进行分组?
- 我是否需要
Grouping
类?
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
}});
编辑: 发帖后,我意识到最初的GroupBy参数会导致一组项目,而我正在寻找Group-SubGroup结果。
编辑2:
为了进一步澄清,我不想让相关的工作成为结果的一部分,而是要按照学科-工作类别进行分组 - 这就是Grouping
类的原因。
@Obalix基于初始解决方案
编辑7-Mar-2010:
这个解决方案不起作用 - 在对象Disipline上的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()
});