public IEnumerable <(string, TaskControl)> GetFullShortage(DateTime?endTime = null) { var taskControl_Items = Db.TaskControl_Items .Where(x => x.HeadId == TaskControl_Head.Id); if (TimeUnit == TimeUnit.Infinity) { var valami = Db.TaskControl_Items .Where(x => x.HeadId == TaskControl_Head.Id) .Include(x => x.TimeRanges) //.SelectMany(x => x.TimeRanges, (i, tr) => new {i, tr}) //.Where(x => !x.tr.Any()) .ToHashSet() .Where(x => !x.TimeRanges.Any()); foreach (var taskControl_Item in valami) { var res = new TaskControl(TimeUnit); res.AddTimeRange(TimeRange.Infinity()); yield return(taskControl_Item.Code, res); } } else { foreach (var taskControl_Item in taskControl_Items) { var res = new DbTaskControl(Db, TimeUnit, TimeType, TaskControlDomain, taskControl_Item.Code, taskControl_Item.DateTimeStart) .GetShortage(endTime); yield return(taskControl_Item.Code, res); } } }
/// <summary> /// Invertálja a Timeranges-t. Olyan időintervallumokat tartalmazó TimeControl -t ad vissza, ami a beadott dátumok közötti összes meg nem jelölt időszakot tartalmazza. /// </summary> public TaskControl GetInverseTimeControl(TimeRange timeRange) { var res = new TaskControl(TimeUnit); ReloadData(); if (TimeUnit == TimeUnit.Infinity) { if (TimeRanges.Any()) { res.RemoveTimeRange(TimeRange.Infinity()); } else { res.AddTimeRange(TimeRange.Infinity()); } } else { //Ez az az időpont, amelyik már éppen NINCS benne a vizsgált időszakban DateTime realStartTime = TimeFunctions.TruncDateTime(TimeUnit, timeRange.DateTimeStart); DateTime realEndTime = timeRange.EndOfTimeRange(TimeUnit); /*if (TimeType == TimeType.Moment)//Ha időpontot vizsgálok, akkor a záró időpontot kiterjesztem a megadott időpontot tartalmazó időszak végéig. * realEndTime = AddDateTime(realEndTime, 1); * else//Ha időszakot vizsgálok, akkor a kapott endtime paraméterben levő időpontot még intervallumon belülinek veszem, ezért a záró időpontot kiterjesztem 1 legkisebb időegységgel. * realEndTime = realEndTime/*.AddTicks(1)*/ ; //realEndTime = var trInInterval = TimeRanges.Where(x => x.EndOfTimeRange(TimeUnit) > realStartTime && x.DateTimeStart < realEndTime).OrderBy(x => x.DateTimeStart); //első időszak előtti rész var first = trInInterval.FirstOrDefault(); if (first != null && first.DateTimeStart > realStartTime) { var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, first.DateTimeStart)); res.TimeRanges.Add(tr); } TaskControl_TimeRange?prevTimeRange = null; //hozzáadom az egyes időintervallumok között kihagyott időszakokat foreach (var actTimeRange in trInInterval) { if (prevTimeRange != null) { var starttime = prevTimeRange.EndOfTimeRange(TimeUnit); var tr = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, actTimeRange.DateTimeStart)); if (tr.DurationCount > 0) { res.TimeRanges.Add(tr); } } prevTimeRange = actTimeRange; } //hozzáadom az utolsó utáni-t var last = trInInterval.LastOrDefault(); if (last != null && AddDateTime(last.DateTimeStart, last.DurationCount) < realEndTime) { var starttime = last.EndOfTimeRange(TimeUnit); var tr = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, realEndTime)); if (tr.DurationCount > 0) { res.TimeRanges.Add(tr); } } if (!trInInterval.Any()) { var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, realEndTime)); res.TimeRanges.Add(tr); } } return(res); }