每个用户的LINQ Group By Type

时间:2016-03-06 11:01:31

标签: asp.net .net linq webforms

我有一个具有以下结构的对象列表

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查询。

enter image description here

编辑:为我想要的最终结构添加:

我想从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; }
    }

2 个答案:

答案 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();