每个用户的 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();