我有一个具有以下结构的对象列表
public class Jobs
{
public string EmployeeName { get; set; }
public string JobNumber { get; set; }
public string JobPriority { get; set; }
public string JobType { get; set; }
public string Description { get; set; }
public string Status { get; set; }
public string CreatedByUser { get; set; }
public DateTime DueDate { get; set; }
public DateTime UpdateDate { get; set; }
}
我想要做的是返回包含
的对象列表EmployeeName,
Total Count of Jobs assigned to him,
Job Type & Count of each job type assigned to an emploee.
所以从本质上讲,我需要记录列表,如下图所示。我将使用LINQ查询的结果并将其绑定到asp.net GridView
Andrew
Total Jobs: 12
Build Jobs: 3
Config Jobs: 4
Delivery Jobs: 3
如何使用初始列表中的linq获得结果。我想对于专业人士来说,这将是一个非常简单且直接转发的LINQ查询。
编辑:为我想要的最终结构添加:
我想从LINQ得到以下结构的结果。即UserJob列表
public class UserJob
{
public string EmployeeName { get; set; }
public int TotalJobs { get; set; }
public List<UserJobGroup> Tickets { get; set; }
}
public class UserJobGroup
{
public string JobType { get; set; }
public int JobCount { get; set; }
}
答案 0 :(得分:2)
让我们逐步介绍您要构建的查询结构:
现在让我们构建查询。从最高级别的GroupBy
开始:
var empGroups = jobList.GroupBy(j => j.EmployeeName);
将每个组转换为以EmployeeName
作为键的字典,并将作业组计数存储为值:
var jobCountsByEmployee = empGroups
.ToDictionary(
g => g.Key
, g => g.GroupBy(j => j.JobType)
.ToDictionary(jg => jg.Key, jg => jg.Count())
);
最后,添加总计以构建您想要的结果:
var res = jobCountsByEmployee
.ToDictionary(
p => p.Key
, p => new {
Total = p.Value.Sum(jc => jc.Value)
, CountByJob = p.Value
}
);
答案 1 :(得分:2)
dasblinkenlight已经解释过了。通过您的特定课程,它变得更加容易 - 您只需要按照他描述的步骤将其翻译成LINQ。你应该真的能够自己做,特别是查询语法:
var result =
(from job in jobList
group job by job.EmployeeName into employeeNameJobs
let jobTypeJobs =
(from job in employeeNameJobs
group job by job.JobType into jobTypeJobs
select new UserJobGroup
{
JobType = jobTypeJobs.Key,
JobCount = jobTypeJobs.Count()
})
.ToList()
select new UserJob
{
EmployeeName = employeeNameJobs.Key,
TotalJobs = jobTypeJobs.Sum(item => item.JobCount),
Tickets = jobTypeJobs
})
.ToList();