Comment get le nombre total de congés d'un employé dans c #

Je reçois un set d'loggings renvoyés par ma requête SQL où j'obtiens le nom de l'employé et sa date de début et de fin de congé du mois en cours. Mon problème est que je reçois deux loggings du même employé mais avec des dates de congé différentes. Maintenant, je veux toutes les dates de cet employé (qui devrait combiner ses deux datatables de congé) quand il est en congé.

Ma requête SQL est:

SELECT distinct emp.emp_name, NULL as start_date, NULL as end_date FROM employee_details emp WHERE emp.group_name = 'A' and Emp_Id not in (SELECT distinct emp.Emp_Id FROM employee_details emp, offshore_leave_calendar olc WHERE emp.emp_id = olc.emp_id AND emp.group_name = 'A' and datepart(mm,olc.start_date) = datepart(mm, getdate())) union SELECT distinct emp.emp_name, olc.Start_Date, olc.End_Date FROM employee_details emp, offshore_leave_calendar olc WHERE emp.emp_id = olc.emp_id AND emp.group_name = 'A' and datepart(mm, olc.start_date) = datepart(mm,getdate()) 

Ma sortie de la requête ci-dessus est:

 Emp_Name start_date end_date John Sophia Olivia Davis 3/20/2017 12:00:00 AM 3/24/2017 12:00:00 AM Clark 3/21/2017 12:00:00 AM 3/24/2017 12:00:00 AM Paul Thomas 3/21/2016 12:00:00 AM 3/29/2016 12:00:00 AM Thomas 3/6/2017 12:00:00 AM 3/10/2017 12:00:00 AM 

Dans la sortie ci-dessus Thomas est sur deux fois en congé dans le mois en cours. Donc je veux toutes les dates de Thomas quand il est en congé dans une list en C #. Les dates de sortie devraient être:

 3/06/2016 3/07/2016 3/08/2016 3/09/2016 3/10/2016 3/21/2016 3/22/2016 3/23/2016 3/24/2016 3/25/2016 3/26/2016 3/27/2016 3/28/2016 3/29/2016 

Quelqu'un peut-il m'aider à ce sujet?

J'ai une list comme:

  List<LeaveData> leaveList = new List<LeaveData>(); 

où la class LeaveData a ces trois définitions:

 public ssortingng Emp_Name { get; set; } public DateTime? start_date { get; set; } public DateTime? end_date { get; set; } 

Pour chaque date du mois, je veux assigner un employé et l'employé qui est en congé ne devrait pas être assigné. SO J'ai boukey toutes les dates du mois et j'ai écrit ce code pour find les dates où l'employé est en congé:

 for (int i = 0; i < dates.Length; i++) { for (DateTime? date = leaveList[index].start_date; date <= leaveList[index].end_date; date = date.Value.AddDays(1)) { allDates.Add(date); } } 

où index est le nombre de 0-7 (dans ce cas). L'index pointe vers l'un des employés que j'ai reçus de ma requête SQL.

En supposant que vous avez une list de vos employés en C #

 List<Employee> employees = ... IEnumerable<DateTime> leaveDates = employees.Where(emp=>emp.Emp_Name == "Thomas") .SelectMany(emp => Enumerable.Range(0, emp.EndDate.Subtract(emp.StartDate).Days + 1) .Select(d => e.StartDate.AddDays(d))); 

Explication

Cela va get une plage de dates entre deux dates:

 Enumerable.Range(0, e.EndDate.Subtract(e.StartDate).Days + 1) .Select(d => e.StartDate.AddDays(d))); 

Le rest est juste linq pour Where et SelectMany est de projeter et d'aplatir les résultats dans la même séquence

modifier
Comme vos commentaires: si vous avez vos données dans leaveList[index] alors vous replaceiez simplement "Thomas" avec leaveList[index].Emp_Name . Et aussi j'ai ajouté vérifier les dates nulles:

 IEnumerable<DateTime> leaveDates = employees.Where(emp=>emp.Emp_Name == leaveList[index].Emp_Name && emp.StartDate.HasValue && emp.EndDate.HasValue) .SelectMany(emp => Enumerable.Range(0, emp.EndDate.Value.Subtract(emp.StartDate.Value).Days + 1) .Select(d => e.StartDate.Value.AddDays(d))); 

Une class avec la propriété suivante

 public class EmployeeLeave { public ssortingng empName {get; set;} public List<DateTime> LeavesDate {get;set;} } 

Itérer sur tous les employés

 var allEmployeeLeaveList = new List<EmployeeLeave>(); foreach(var employee in LeaveData) { var tempDate = employee.StartDate.valueOrDefault(); while((employee.EndDate.valueOrDefault() - tempDate).TotalDays > 0) { if( allEmployeeLeaveList .Any(x=>x.empName == employee.Emp_Name )) { allEmployeeLeaveList .Where(x=>x.empName == employee.Emp_Name ).LeavesDate .Add(tempDate); } else { allEmployeeLeaveList.Add(new EmployeeLeave { empName = employee.Emp_Name , LeavesDate = new List<DateTime> {tempDate} }); } tempDate.AddDays(1) } } 

voir l'exigence que vous voulez atsortingbuer une date de congé à "Present Employee" me semble facile, et cela peut être fait en sql lui-même, à condition que nous ayons des informations complètes en premier lieu.

et quels sont les critères d'affectation des employés. J'ai travaillé sur votre sortie en supposant qu'il s'agissait d'un autre CTE.

 declare @t table(Emp_Name varchar(50),start_date datetime,end_date datetime) insert into @t VALUES ('John',null,null) ,('Sophia',null,null) ,('Olivia',null,null) ,('Davis','3/20/2017 12:00:00 AM ', '3/24/2017 12:00:00 AM') ,('Clark','3/21/2017 12:00:00 AM','3/24/2017 12:00:00 AM') ,('Paul',null,null) ,('Thomas','3/21/2016 12:00:00 AM', '3/29/2016 12:00:00 AM') ,('Thomas','3/6/2017 12:00:00 AM', '3/10/2017 12:00:00 AM') ;With CTE as ( select *,ROW_NUMBER()over(partition by Emp_Name order by start_date)RN ,DATEDIFF(day,start_date,end_date) rn1 from @t where start_date is not null ) ,CTE1 AS( select Emp_Name,start_date , end_date,rn,rn1 from cte UNION ALL SELECT c.Emp_Name,DATEADD(day,1,c1.start_date), c.end_date,c1.rn ,c1.rn1 FROM cte c inner join cte1 c1 on c.Emp_Name=c1.Emp_Name where c.rn=c1.rn and C1.start_date<c.end_date ) SELECT Emp_Name ,start_date leavedates FROM CTE1 order by Emp_Name