Группировка и подсчет после перекрестного соединения в LINQ - PullRequest
0 голосов
/ 06 мая 2020

У меня проблема с оператором LINQ. То есть, я хочу сделать отчет «В отделе X Y сотрудников на уровне Z» или «В отделе исследований и разработок 12 человек находятся на уровне 2».

Таблица отдела: id, код, имя

Таблица уровней отдела: уровень

Подразделение персонала: идентификатор_персонала, идентификатор_отдела, текущий уровень

Здесь мой запрос LINQ:

var query = (
            from a in cx.Department
            from al in cx.DepartmenLevel
            join pd in cx.PersonnelDepartment on
                new { dId = a.Id, al.Level, IsDeleted = false } equals
                new { dId = ppa.PdAbilityId, Level = pd.CurrentLevel, pd.IsDeleted } into pdj
            from pd in pdj.DefaultIfEmpty()
            where a.IsDeleted == false && al.IsDeleted == false
            select new
            {
                dep = new
                {
                    a.Id,
                    a.Code,
                    a.Name
                },
                depLevel = new
                {
                    al.Level
                },
                perDep = new
                {
                    Id = (Guid?)ppa.PdPersonnelId ?? null
                }
            });

И отображение в backend:

var tempRes2 = await query.ToListAsync();

        var tempRes = tempRes2
                    .GroupBy(g => new { g.dep, g.depLevel, g.perDep })
                    .Select(s => new { s.Key.dep, s.Key.depLevel, s.Key.perDep })
                    .ToList();
        IList<ParentResultDto> result =
        tempRes.GroupBy(g => g.dep).Select(s => new ParentResultDto()
        {
            DepartmentCode = s.Key.Code,
            DepartmentName = s.Key.Name,
            DepartmentLevel = tempRes
                                  .Where(w => w.dep.Id == s.Key.Id)
                                  .GroupBy(g1 => new { g1.depLevel , g1.perDep })
                                  .Select(s1 => new ChildResultDto()
                                  {
                                      Level = s1.Key.depLevel.Level,
                                      PersonnelCount = s1.Key.perDep.Distinct().Count
                                  }).ToList()
        }).ToList();

        return result;

Запрос g1.perDep взорвет группу. И я понятия не имею, как это решить. Я думаю, это работа. Спасибо за ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...