public string Add(DateTime Endrepeat, string period, Timetable timetable) { string answer = Сheck(this); if (answer == "Данные корректны!") { List <Timetable> listtimetable = new List <Timetable>(); List <TimeRange> listtimerange = new List <TimeRange>(); //Ежедневно //Еженедельно //Ежемесячно //Каждый год //Каждый будний день(пн - пт) DateTime newstart = timetable.Startlesson; // Присваиваем дате начала занятия пока что начальное значение переданное извне, далее эта переменная будет изменяться DateTime newend = timetable.Endlesson; // Присваиваем дате окончания занятия пока что начальное значение переданное извне, далее эта переменная будет изменяться while (newend <= Endrepeat) // Организуем цикл для перебора всех дат в заданном диапазоне, т.е. до Endrepeat { using (SampleContext context = new SampleContext()) { Timetable v = context.Timetables.Where(x => x.Startlesson == newstart).FirstOrDefault <Timetable>(); // В первом проходе добавляется или не добавляется начальная дата, а дальше уже происходит увеличение дат if (v == null & (period != "Каждый будний день(пн - пт)")) // Добавление для всех вариантов, кроме будних дней, т.к. не нужно учитывать выходные! { Timetable newtimetable = new Timetable(); // Создаем новый экземпляр класса newtimetable.CabinetID = timetable.CabinetID; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.CourseID = timetable.CourseID; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.Note = timetable.Note; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.Startlesson = newstart; // Добавляем изменяемые атрибуты (дата начала занятия) в новый объект newtimetable.Endlesson = newend; // Добавляем изменяемые атрибуты (дата окончания занятия) в новый объект listtimetable.Add(newtimetable); // Добавление объекта в лист TimeRange Range = new TimeRange(newstart, newend); listtimerange.Add(Range); } if ((period == "Каждый будний день(пн - пт)") & v == null & (newstart.DayOfWeek != DayOfWeek.Saturday & newstart.DayOfWeek != DayOfWeek.Sunday)) // Добавление для варианта будних дней, т.к. нужно учитывать выходные и не добавлять такие дни в список! { Timetable newtimetable = new Timetable(); // Создаем новый экземпляр класса newtimetable.CabinetID = timetable.CabinetID; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.CourseID = timetable.CourseID; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.Note = timetable.Note; // Добавляем неизменные атрибуты в новый объект из переданного объекта newtimetable.Startlesson = newstart; // Добавляем изменяемые атрибуты (дата начала занятия) в новый объект newtimetable.Endlesson = newend; // Добавляем изменяемые атрибуты (дата окончания занятия) в новый объект listtimetable.Add(newtimetable); // Добавление объекта в лист TimeRange Range = new TimeRange(newstart, newend); listtimerange.Add(Range); } } if (period == "Ежедневно") // Изменение дат исходя из условия { newstart = newstart.AddDays(1); newend = newend.AddDays(1); } if (period == "Еженедельно") // Изменение дат исходя из условия { newstart = newstart.AddDays(7); newend = newend.AddDays(7); } if (period == "Ежемесячно") // Изменение дат исходя из условия { newstart = newstart.AddMonths(1); newend = newend.AddMonths(1); } if (period == "Каждый год") // Изменение дат исходя из условия { newstart = newstart.AddYears(1); newend = newend.AddYears(1); } if (period == "Каждый будний день(пн - пт)") // Изменение дат исходя из условия { //if (newstart.DayOfWeek != DayOfWeek.Saturday || newend.DayOfWeek != DayOfWeek.Sunday) { newstart = newstart.AddDays(1); newend = newend.AddDays(1); } } } using (SampleContext context = new SampleContext()) // После завершения цикла нужно добавить значения листа в бд { context.Timetables.AddRange(listtimetable); context.SaveChanges(); if (listtimetable.Count == 0) // Может быть ситуация, при которой ни один объект не был добавлен в бд, пользователь будет осведомлен { return(answer = "Ни один элемент расписания не был добавлен"); } } } return(answer = "Добавление элемента(ов) расписания прошло успешно"); }
public List <Worker> GetFreeteachers(DateTime Endrepeat, string period) // Поиск свободных на это время преподавателей { // List<Worker> teachers = context.Workers.Where(x => x.Type == 3).ToList<Worker>(); // Отбор только преподавателей // foreach (Worker t in teachers) // Цикл по каждому преподавателю, для поиска всех эл. расписания, которые еще ведет этот преподаватель // { // List<TimetablesTeachers> timetablesT = context.TimetablesTeachers.Where(x => x.TeacherID == t.ID).ToList<TimetablesTeachers>(); // if (timetablesT.Count != 0) // Если список не пуст, значит нужно проверить каждый эл. расписания из этого листа на временное перекрытие с заданным диапазоном // { // foreach (TimetablesTeachers tt in timetablesT) // Цикл для каждого элемента расписания одного преподавателя // { // Timetable onetimetable = Timetables.TimetableID(tt.TimetableID); // эл. расписания, который есть у преподавателя (найденный по ID) // TimeRange timetablerange = new TimeRange(onetimetable.Startlesson, onetimetable.Endlesson); // Составление интервала для поиска временных перекрытий // bool overlap = Overlap(timetablerange, listtimerange); // Вызов метода, где проверяется конкретный промежуток расписания с заданным диапазоном! // if(overlap == true) // Если эл. расписания не перекрывается ни с одним промежутком из диапазона, то // { // } // } // } // else // { // freeteachers.Add(t); // } // } // } //} // Select* from Worker where //Type = [Учитель] // and //ID not in //( //Select ID_Teacher from Timetable join TimetableTeachers //on TimetableTeachers.ID_Timetable = Timetable.ID //Start_date >= [1_дата_начало] and EndDate <= [1_дата_конец] — вот эти штуки нужно делать в цикле //or //Start_date >= [2_дата_начало] and EndDate <= [2_дата_конец] //or //... //or //Start_date >= [N_дата_начало] and EndDate <= [N_дата_конец] //) List <TimeRange> listtimerange = new List <TimeRange>(); //Ежедневно //Еженедельно //Ежемесячно //Каждый год //Каждый будний день(пн - пт) DateTime newstart = this.Startlesson; // Присваиваем дате начала занятия пока что начальное значение переданное извне, далее эта переменная будет изменяться DateTime newend = this.Endlesson; // Присваиваем дате окончания занятия пока что начальное значение переданное извне, далее эта переменная будет изменяться while (newend <= Endrepeat) // Организуем цикл для перебора всех дат в заданном диапазоне, т.е. до Endrepeat { using (SampleContext context = new SampleContext()) { Timetable v = context.Timetables.Where(x => x.Startlesson == newstart).FirstOrDefault <Timetable>(); // В первом проходе добавляется или не добавляется начальная дата, а дальше уже происходит увеличение дат if (v == null & (period != "Каждый будний день(пн - пт)")) // Добавление для всех вариантов, кроме будних дней, т.к. не нужно учитывать выходные! { TimeRange Range = new TimeRange(newstart, newend); listtimerange.Add(Range); } if ((period == "Каждый будний день(пн - пт)") & v == null & (newstart.DayOfWeek != DayOfWeek.Saturday & newstart.DayOfWeek != DayOfWeek.Sunday)) // Добавление для варианта будних дней, т.к. нужно учитывать выходные и не добавлять такие дни в список! { TimeRange Range = new TimeRange(newstart, newend); listtimerange.Add(Range); } } if (period == "Ежедневно" || period == "Не повторять" || period == "Каждый будний день(пн - пт)") // Изменение дат исходя из условия { newstart = newstart.AddDays(1); newend = newend.AddDays(1); } if (period == "Еженедельно") // Изменение дат исходя из условия { newstart = newstart.AddDays(7); newend = newend.AddDays(7); } if (period == "Ежемесячно") // Изменение дат исходя из условия { newstart = newstart.AddMonths(1); newend = newend.AddMonths(1); } if (period == "Каждый год") // Изменение дат исходя из условия { newstart = newstart.AddYears(1); newend = newend.AddYears(1); } //if (period == "Каждый будний день(пн - пт)") // Изменение дат исходя из условия //{ // { // newstart = newstart.AddDays(1); // newend = newend.AddDays(1); // } //} } List <Worker> freeteachers = new List <Worker>(); // Лист свободных преподавателей using (SampleContext context = new SampleContext()) { StringBuilder s = new StringBuilder("Select Distinct Workers.* from Workers where Workers.Type = 3 and Workers.ID not in (Select Distinct Workers.ID from Workers join TimetablesTeachers on TimetablesTeachers.TeacherID = Workers.ID and Workers.Type = 3 join Timetables on TimetablesTeachers.TimetableID = Timetables.ID where "); List <string> sql = new List <string>(); string format = "yyyy-MM-dd HH:mm:ss"; foreach (TimeRange t in listtimerange) { sql.Add(String.Format("(Startlesson >= '{0}' and Endlesson <= '{1}' and Startlesson <= '{1}')", t.Start.ToString(format), t.End.ToString(format))); // Внутри sql.Add(String.Format("(Startlesson <= '{0}' and Endlesson >= '{1}' and Startlesson <= '{1}')", t.Start.ToString(format), t.End.ToString(format))); // Снаружи sql.Add(String.Format("(Startlesson >= '{0}' and Endlesson >= '{1}' and Startlesson <= '{1}')", t.Start.ToString(format), t.End.ToString(format))); // верхняя граница sql.Add(String.Format("(Startlesson <= '{0}' and Endlesson <= '{1}' and Endlesson >= '{0}')", t.Start.ToString(format), t.End.ToString(format))); // нижняя граница } s.Append(String.Join(" or ", sql)); var query = context.Workers.SqlQuery(s.ToString() + " group by Workers.ID order by Workers.ID)"); foreach (Worker t in query) { freeteachers.Add(t); } } return(freeteachers); }