//метод поиска записей, которые возможно "склеить" static Entity HasContinue(CostsDB db) { return(db.Entities .Where(x => db.Entities .Where(y => y.EndDate == x.StartDate && y.AdultsMainWeekday == x.AdultsMainWeekday && y.AdultsMainWeekend == x.AdultsMainWeekend).FirstOrDefault().ID != null) .FirstOrDefault()); }
static void Main(string[] args) { //создал базу, в которую залил исходную таблицу, создал модель базы, работаю с ней через EntityFramework //с помощью C#, Linq выражений //скрипт не складывает стоимость в одно число, насколько я понял, записывается стоимость за день using (CostsDB db = new CostsDB()) { Entity startPeriod = null; //пока есть не сокращенные записи, "склеиваем" while (HasContinue(db) != null) { //находит запись, к которой можно приклеить другую startPeriod = HasContinue(db); //ищет запись сверху(по дате) var endPeriod = db.Entities .Where(x => x.StartDate == startPeriod.EndDate && startPeriod.AdultsMainWeekday == x.AdultsMainWeekday && startPeriod.AdultsMainWeekend == x.AdultsMainWeekend) .FirstOrDefault(); //если не нашёл, ищет запись снизу(по дате) if (endPeriod == null) { endPeriod = db.Entities .Where(x => x.EndDate == startPeriod.StartDate && startPeriod.AdultsMainWeekday == x.AdultsMainWeekday && startPeriod.AdultsMainWeekend == x.AdultsMainWeekend) .FirstOrDefault(); //удаляет обе записи, создает на их основу одну db.Entities.Remove(startPeriod); db.Entities.Remove(endPeriod); startPeriod.StartDate = endPeriod.StartDate; db.SaveChanges(); } else { //удаляет обе записи, создает на их основу одну db.Entities.Remove(startPeriod); db.Entities.Remove(endPeriod); startPeriod.EndDate = endPeriod.EndDate; db.SaveChanges(); } //вносит новую запись в базу db.Entities.Add(startPeriod); db.SaveChanges(); } //выводим в консоль итоговое кол-во записей(получилось 28) Console.WriteLine(db.Entities.Count()); } Console.ReadKey(); }