每个用户的 LINQ 按类型分组
LINQ Group By Type for each user
我有一个具有以下结构的对象列表
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; }
}
我想做的是return一个包含
的对象列表
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; }
}
让我们来看看您要构建的查询的结构:
- 在顶层,您需要按员工分组
- 在员工级别,您需要两个相关但独立的东西:
- 您需要按工作单独计数,并且
- 您还需要这些计数的总和
现在让我们构建查询。从 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
}
);
已经解释过了。使用您的特定 类,它甚至更容易 - 您只需按照他描述的步骤并将它们转换为 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();
我有一个具有以下结构的对象列表
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; }
}
我想做的是return一个包含
的对象列表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; }
}
让我们来看看您要构建的查询的结构:
- 在顶层,您需要按员工分组
- 在员工级别,您需要两个相关但独立的东西:
- 您需要按工作单独计数,并且
- 您还需要这些计数的总和
现在让我们构建查询。从 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
}
);
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();