2016-03-06 3 views
0

У меня есть список объектов с последующей структуройLINQ Group By Type для каждого пользователя

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

EDIT: Добавлены для окончательной структуры, что я хочу:

Я хотел бы получить результат от 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

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(); 
+0

Благодаря @dasblinkenlight и вам, мне удалось заставить его работать ... вы, ребята, потрясающие ...я прочесывал голову вокруг этого в течение более 4 часов .... Большое спасибо, чтобы вы оба исправили это! – user869375

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 
     } 
    ); 
+0

Отличный материал @dasblinkenlight. Это на самом деле заняло меня на один шаг ближе к тому, что я хочу. Только если вы действительно поможете мне пройти этот последний шаг. Дополнительную информацию см. В моем обновлении в вопросе ..... Теперь я хочу перенести данные из вашего последнего запроса (var res) в коллекцию объектов. Если вы можете мне помочь, я бы назвал это ответом ... спасибо тонну. – user869375

+1

@ user869375 Конечно, я должен быть в состоянии помочь, как только я доберусь до своего компьютера (это не полезно для редактирования кода на телефоне). Тем временем вы можете попробовать сделать это как упражнение при проецировании словарей в списки. Это хорошая вещь, чтобы учиться, потому что она появляется достаточно часто, особенно в коде дисплея. – dasblinkenlight