Организационная структура - группа по менеджеру, чтобы показать всех сотрудников под ним - PullRequest
0 голосов
/ 26 марта 2020

Ниже приведен код для отображения отчетов о сотрудниках и менеджерах. У меня есть группа, так что должны отображаться все сотрудники под одним менеджером, но отображается только 1 сотрудник. что мне не хватает?

LINQ Group By Logi c -

var emp = (from m in employee
                       group m by m.ManagerId into g
                       join e1 in employee on g.FirstOrDefault().ManagerId equals e1.EmpId into temp
                       from t1 in temp.DefaultIfEmpty()                       
                       select new 
                       {
                           EmpId = g.FirstOrDefault().EmpId,
                           EmployeeName = g.FirstOrDefault().EmployeeName,
                           Gender = g.FirstOrDefault().Gender,
                           ManagerId = t1?.ManagerId ?? 0  ,
                           ManagerName = t1?.EmployeeName ?? "Top of the Chain",
                           Designation = g.FirstOrDefault().Designation
                       }).ToList();

Я добавил реализацию AddEmployee () и RemoveEmployee (), как показано ниже, и вызвал, как показано ниже, но Removeemployee делает не удалить сотрудника из иерархии ??

employee.Add(new Employee { EmpId = 11, EmployeeName = "Chris Harris", Gender = 'M', ManagerId = 7, Designation = "Executive" });
            employee.Add(new Employee { EmpId = 13, EmployeeName = "Rocky Balbo", Gender = 'M', ManagerId = null, Designation = "CEO" });

            int? ceo = null;

            AddEmployee(new Employee { EmpId = 2, EmployeeName = "Rohan Kumar", Gender = 'M', ManagerId = 13, Designation = "Application Architect"  });
            AddEmployee(new Employee { EmpId = 1, EmployeeName = "Mohan Kumar", Gender = 'M', ManagerId = 2, Designation = "Tech Lead" });
            RemoveEmployee(new Employee { EmpId = 9, EmployeeName = "Rogger Binny", Gender = 'M', ManagerId = 7, Designation = "Sales Executive" });
            GetHierarchy(ceo, 0, "");

   static void AddEmployee(Employee empDetails)
        {
            employee.Add(empDetails);
        }

        static void RemoveEmployee(Employee empDetails)
        {
            employee.Remove(empDetails);
        } 

public class Employee
    {
        public int EmpId { get; set; }
        public string EmployeeName { get; set; }
        public char Gender { get; set; }
        public int? ManagerId { get; set; }
        public string Designation { get; set; }
        public string ManagerName { get; set; }
    }

List<Employee> employee = new List<Employee>();
            employee.Add(new Employee { EmpId = 3, EmployeeName = "Andrea Ely", Gender = 'F', ManagerId = 6, Designation = "Tech Head"});
            employee.Add(new Employee { EmpId = 4, EmployeeName = "John Eward", Gender = 'M', ManagerId = 3, Designation = "General" });
            employee.Add(new Employee { EmpId = 5, EmployeeName = "Lesli Mac", Gender = 'F', ManagerId = 3, Designation = "Staff" });
            employee.Add(new Employee { EmpId = 6, EmployeeName = "Satinder Singh", Gender = 'M', ManagerId = 13, Designation = "President" });
            employee.Add(new Employee { EmpId = 7, EmployeeName = "Amit Sarna", Gender = 'M', ManagerId = 13, Designation = "Vice President" });
            employee.Add(new Employee { EmpId = 8, EmployeeName = "David Steward", Gender = 'M', ManagerId = 7, Designation = "General" });
            employee.Add(new Employee { EmpId = 9, EmployeeName = "Rogger Binny", Gender = 'M', ManagerId = 7, Designation = "Sales Executive" });
            employee.Add(new Employee { EmpId = 10, EmployeeName = "Emy jackson", Gender = 'F', ManagerId = 7, Designation = "Sales Executive" });
            employee.Add(new Employee { EmpId = 11, EmployeeName = "Chris Harris", Gender = 'M', ManagerId = 7, Designation = "Executive" });
            employee.Add(new Employee { EmpId = 13, EmployeeName = "Rocky Balbo", Gender = 'M', ManagerId = null, Designation = "CEO" });

var emp = (from m in employee
                       group m by m.ManagerId into g
                       join e1 in employee on g.FirstOrDefault().ManagerId equals e1.EmpId into temp
                       from t1 in temp.DefaultIfEmpty()                       
                       select new 
                       {
                           EmpId = g.FirstOrDefault().EmpId,
                           EmployeeName = g.FirstOrDefault().EmployeeName,
                           Gender = g.FirstOrDefault().Gender,
                           ManagerId = t1?.ManagerId ?? 0  ,
                           ManagerName = t1?.EmployeeName ?? "Top of the Chain",
                           Designation = g.FirstOrDefault().Designation
                       }).ToList();

            Console.WriteLine("--------------Printing Manager-Employee Hierarchy-------------");
            foreach (var empDetails in emp)
            {               
                Console.WriteLine("Emp Name is {0} ManagerName is {1}", empDetails.EmployeeName, empDetails.ManagerName);                
            }

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Использовать рекурсивный алгоритм:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static List<Employee> employees;
        static void Main(string[] args)
        {
            employees = new List<Employee>();
            employees.Add(new Employee { EmpId = 3, EmployeeName = "Andrea Ely", Gender = 'F', ManagerId = 6, Designation = "Tech Head"});
            employees.Add(new Employee { EmpId = 4, EmployeeName = "John Eward", Gender = 'M', ManagerId = 3, Designation = "General" });
            employees.Add(new Employee { EmpId = 5, EmployeeName = "Lesli Mac", Gender = 'F', ManagerId = 3, Designation = "Staff" });
            employees.Add(new Employee { EmpId = 6, EmployeeName = "Satinder Singh", Gender = 'M', ManagerId = 13, Designation = "President" });
            employees.Add(new Employee { EmpId = 7, EmployeeName = "Amit Sarna", Gender = 'M', ManagerId = 13, Designation = "Vice President" });
            employees.Add(new Employee { EmpId = 8, EmployeeName = "David Steward", Gender = 'M', ManagerId = 7, Designation = "General" });
            employees.Add(new Employee { EmpId = 9, EmployeeName = "Rogger Binny", Gender = 'M', ManagerId = 7, Designation = "Sales Executive" });
            employees.Add(new Employee { EmpId = 10, EmployeeName = "Emy jackson", Gender = 'F', ManagerId = 7, Designation = "Sales Executive" });
            employees.Add(new Employee { EmpId = 11, EmployeeName = "Chris Harris", Gender = 'M', ManagerId = 7, Designation = "Executive" });
            employees.Add(new Employee { EmpId = 13, EmployeeName = "Rocky Balbo", Gender = 'M', ManagerId = null, Designation = "CEO" });

            int? ceo = null;
            GetHierarchy(ceo, 0, "");

        }
        static void GetHierarchy(int? managerID, int level, string managerName)
        {
            List<Employee> group = employees.Where(x => x.ManagerId  == managerID).ToList();
            foreach (Employee empDetails in group)
            {
                Console.WriteLine("{0}Emp Name is {1} ManagerName is {2}", new string(' ', 5 * level), empDetails.EmployeeName, managerName);
                GetHierarchy(empDetails.EmpId, level + 1, empDetails.EmployeeName);
            }
        }
    }
    public class Employee
    {
        public int EmpId { get; set; }
        public string EmployeeName { get; set; }
        public char Gender { get; set; }
        public int? ManagerId { get; set; }
        public string Designation { get; set; }
        public string ManagerName { get; set; }
    }


}
1 голос
/ 26 марта 2020

Обновление согласно комментарию

При вызове RemoveEmployee вы создаете новый object, что означает новую ссылку в памяти. тогда два objects не равны (объект в списке employee и новый object), но значения (значения empId ...) совпадают.

Удалить Для элемента из employee у вас есть два решения:
1 - используйте RemoveAll и выполните фильтрацию по empId или создайте другой метод, который принимает empId, например, следующий код:

void RemoveEmployee(Employee empDetails)
{
    employee.RemoveAll(emp => emp.EmpId == empDetails.EmpId);
}
void RemoveEmployee(int empId)
{
    employee.RemoveAll(emp => emp.EmpId == empId);
}

2 - Фильтруйте при вызове RemoveEmployee, например, следующий код:

RemoveEmployee(employee.First(emp => emp.EmpId == 9));

Старое решение

Если вы правильно понимаете, проблема здесь в ManagerName, ваш код в порядке, но вам нужно избегать FirstOrdDefault, чтобы получить ожидаемый результат, выполняя цикл для каждого элемента в g, как в следующем коде:

var groupedEmp = (from m in employee
            group m by m.ManagerId into g
            join e1 in employee on g.Key equals e1.EmpId into temp
            from t1 in temp.DefaultIfEmpty()
            select new
            {
                g = g,
                t1 = t1
            });

var empList = groupedEmp
           .SelectMany(x => x.g.Select(y =>
                new Employee
                {
                    EmpId = y.EmpId,
                    EmployeeName = y.EmployeeName,
                    Designation = y.Designation,
                    Gender = y.Gender,
                    ManagerId = y.ManagerId ?? 0,
                    ManagerName = x.t1?.EmployeeName ?? "Top"
                })).ToList();

Тест

foreach(Employee employe in empList)
{
    Console.WriteLine($"EmpId  :  {employe.EmpId}, EmpName  :  {employe.EmployeeName}, MngId  :  {employe.ManagerId}, MngName  :  {employe.ManagerName}");
}

Результат

EmpId  :  3, EmpName  :  Andrea Ely, MngId  :  6, MngName  :  Satinder Singh
EmpId  :  4, EmpName  :  John Eward, MngId  :  3, MngName  :  Andrea Ely
EmpId  :  5, EmpName  :  Lesli Mac, MngId  :  3, MngName  :  Andrea Ely
EmpId  :  6, EmpName  :  Satinder Singh, MngId  :  13, MngName  :  Rocky Balbo
EmpId  :  7, EmpName  :  Amit Sarna, MngId  :  13, MngName  :  Rocky Balbo
EmpId  :  8, EmpName  :  David Steward, MngId  :  7, MngName  :  Amit Sarna
EmpId  :  9, EmpName  :  Rogger Binny, MngId  :  7, MngName  :  Amit Sarna
EmpId  :  10, EmpName  :  Emy jackson, MngId  :  7, MngName  :  Amit Sarna
EmpId  :  11, EmpName  :  Chris Harris, MngId  :  7, MngName  :  Amit Sarna
EmpId  :  13, EmpName  :  Rocky Balbo, MngId  :  0, MngName  :  Top

Надеюсь, это поможет.

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