private async Task ProcessChanges(IApplication app, SyncRequestViewModel request) { if (request.Changes != null && request.Changes.Any()) { var dbChanges = new List <IChange>(); Stopwatch sw = new Stopwatch(); sw.Start(); // Dedup any changes with the same Record, Entity and Property var uniqueChanges = new Dictionary <string, SyncRequestViewModel.ChangeViewModel>(); foreach (var change in request.Changes) { string key = $"{change.RecordId}-{change.Entity}-{change.Property}"; if (uniqueChanges.TryGetValue(key, out var existingChange)) { if (change.MillisecondsAgo < existingChange.MillisecondsAgo) { uniqueChanges[key] = change; } } else { uniqueChanges.Add(key, change); } } Logger.LogInformation($"Deduped changes in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}"); sw.Restart(); foreach (var change in uniqueChanges.Values) { if (change != null) { DateTime modifiedUTC = requestStartTimeUTC.AddMilliseconds(-change.MillisecondsAgo); var dbChange = ChangeRepository.CreateChange(app.AccountId, app.Id, change.RecordId, change.Group, change.Entity, change.Property, modifiedUTC.Ticks, change.Value); dbChanges.Add(dbChange); } } Logger.LogInformation($"Generated changes in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}"); sw.Restart(); if (dbChanges.Any()) { sw.Restart(); await ChangeRepository.UpsertChangesAsync(app.Id, dbChanges); Logger.LogInformation($"Saved changes to database in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}"); } sw.Stop(); } }