private async Task <bool> ProcessRecord <T>(T record, string table, DateTime now) where T : CsvBaseObject { if (string.IsNullOrEmpty(record.sourcedId)) { throw new ProcessingException(Logger.Here(), $"Record of type {typeof(T).Name} contains no SourcedId: {JsonConvert.SerializeObject(record)}"); } DataSyncLine line = await Repo.Lines <T>().SingleOrDefaultAsync(l => l.SourcedId == record.sourcedId); bool isNewRecord = line == null; Repo.CurrentHistory.NumRows++; string data = JsonConvert.SerializeObject(record); if (isNewRecord) { // already deleted if (record.isDeleted) { Repo.CurrentHistory.NumDeleted++; return(false); } Repo.CurrentHistory.NumAdded++; line = new DataSyncLine { SourcedId = record.sourcedId, DistrictId = Repo.DistrictId, LoadStatus = LoadStatus.Added, LastSeen = now, Table = table, }; Repo.AddLine(line); } else // existing record, check if it has changed { line.LastSeen = now; line.Touch(); // no change to the data, skip! if (line.RawData == data) { if (line.SyncStatus != SyncStatus.Loaded) { line.LoadStatus = LoadStatus.NoChange; } return(false); } // status should be deleted if (record.isDeleted) { Repo.CurrentHistory.NumDeleted++; line.LoadStatus = LoadStatus.Deleted; } else if (line.SyncStatus == SyncStatus.Loaded && line.LoadStatus == LoadStatus.Added) { Repo.CurrentHistory.NumAdded++; line.LoadStatus = LoadStatus.Added; // if added, leave added } else { Repo.CurrentHistory.NumModified++; line.LoadStatus = LoadStatus.Modified; } } line.RawData = data; line.SourcedId = record.sourcedId; line.SyncStatus = SyncStatus.Loaded; Repo.PushLineHistory(line, isNewData: true); return(isNewRecord); }