コード例 #1
0
 private  List<CalendarItem> MergeItems(List<CalendarItem> newItems, List<CalendarItem> fromRepo)
 {
     var result = new List<CalendarItem>();
     var newModels = newItems.Except(fromRepo, new CalendarItemEqualityComparer()).ToList();
     var updatet = fromRepo.Except(newModels,new CalendarItemEqualityComparer()).ToList();
     updatet.ForEach(x =>
     {
         var model = newItems.FirstOrDefault(y => y.Id == x.Id);
         if (model != null)
         {
             model.SyncStatus.CalenadCalendarItemStatus = IsModified(model, x)
                 ? CalendarItemStatus.Updated
                 : CalendarItemStatus.Unmodified;
             result.Add(model);
         }
     });
     var deleted = fromRepo.Where(x => x.Start.Date >= DateTime.Now.Date).Except(newItems).Except(updatet);
     newModels.ForEach(x => x.SyncStatus.CalenadCalendarItemStatus = CalendarItemStatus.New);
     deleted.ForEach(x =>
     {
         x.SyncStatus.CalenadCalendarItemStatus = CalendarItemStatus.Deleted;
         result.Add(x);
     });
     result.AddRange(newModels);
     return result.OrderBy(x => x.Start).ToList();
 }
コード例 #2
0
        /// <summary>
        /// You are allowed a route with no departure times, so this method doesn't check that departure times exist already.
        /// </summary>
        /// <param name="route_id"></param>
        /// <param name="event_id"></param>
        /// <param name="departureTimes"></param>
        public void Update(int route_id, int event_id, List<WeeklyTime> departureTimes)
        {
            // check values
            if (route_id == 0)
                throw new ArgumentException("Route_id cannot be zero", "route_id");

            if (event_id == 0)
                throw new ArgumentException("Event_id cannot be zero", "event_id");

            if (departureTimes == null)
                throw new ArgumentException("departureTimes cannot be null", "departureTimes");

            var currentList = Load(route_id);
            var difference = departureTimes.Except(currentList, new WeeklyTime.Comparer()).ToList<WeeklyTime>();

            if (difference.Count() == 0)
                return; // you are allowed to call update even if it doesn't make a difference.

            // get times to add and remove
            var toDelete = difference.Intersect(currentList, new WeeklyTime.Comparer()).ToList<WeeklyTime>();
            var toAdd = difference.Intersect(departureTimes, new WeeklyTime.Comparer()).ToList<WeeklyTime>();

            lock (Database.Instance)
            {

                // save all new entries
                foreach (WeeklyTime time in toAdd)
                {
                    var sql = SQLQueryBuilder.CreateNewRecord(TABLE_NAME, ID_COL_NAME, new[] { EVENT_ID, "route_id", "weekly_time" }, new string[] { event_id.ToString(), route_id.ToString(), time.Value.Ticks.ToString() });
                    Database.Instance.InsertQuery(sql);
                }

                // delete all non existing entries
                foreach (WeeklyTime time in toDelete)
                {
                    // get the id
                    int departure_time_id = GetId(route_id, time);

                    // set entry to inactive
                    var sql = String.Format("UPDATE `{0}` SET active=0 WHERE {1}={2}", TABLE_NAME, ID_COL_NAME, departure_time_id);
                    Database.Instance.InsertQuery(sql);

                    // insert new 'deleted' row
                    sql = SQLQueryBuilder.InsertFields(TABLE_NAME,
                                                       new string[] { EVENT_ID, ID_COL_NAME, "active", "route_id", "weekly_time" },
                                                       new string[] { event_id.ToString(), departure_time_id.ToString(), "-1", route_id.ToString(), "" });
                    Database.Instance.InsertQuery(sql);
                }

            }
        }