考虑以下简化对象和关系:
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.我不确定如果可以做到这一点,或者我采取的方法是否正确.确切的问题本身并不清楚,但上面定义了问题陈述.
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)
以下描述了如何实现分层分组机制。
使用 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)
| 归档时间: |
|
| 查看次数: |
5727 次 |
| 最近记录: |