private List <VersionDetails> _getDataSource() { var versions = new List <VersionDetails>(); var dataService = new RosterDataService(); var rosterEvent = dataService.GetRosterEvent(this.ItemId.Value); var listId = ListId.HasValue ? ListId.Value : (rosterEvent.EventTypeId == 0) ? TableIDs.PLANNED_ROSTERS : TableIDs.WORKING_ROSTERS; var allListFields = new RosterConfigService().GetList(listId).ListMetadataFields.Select(fld => fld.GetDbField()); // get history items var historyInfo = dataService.ListTrackData(this.ItemId.Value); string[] excludeFields = new string[] { FieldNames.ID, FieldNames.ROSTER_EVENT_ID, FieldNames.CONTENT_TYPE_ID, FieldNames.MODIFIED, FieldNames.MODIFIED_BY }; for (int k = 0; k < historyInfo.Count; k++) { var currentVersionTrackData = historyInfo[k].TrackDataDictionary; var fldModifiedByText = string.Empty; var fldModifiedBy = allListFields.FirstOrDefault(f => f.InternalName.Equals(FieldNames.MODIFIED_BY)); if (fldModifiedBy != null) { if (currentVersionTrackData.ContainsKey(FieldNames.MODIFIED_BY)) { fldModifiedByText = fldModifiedBy.GetFieldValueAsText(currentVersionTrackData[FieldNames.MODIFIED_BY]); } } var vd = new VersionDetails(historyInfo[k], fldModifiedByText); if (k == historyInfo.Count - 1) { foreach (string fldName in currentVersionTrackData.Keys.Where(ke => !excludeFields.Contains(ke))) { var fld = allListFields.FirstOrDefault(f => f.InternalName.Equals(fldName)); if (fld == null) { continue; } vd.Changes.Add(new ChangeInfo { FieldName = fld.DisplayName, FieldValue = fld.GetFieldValueAsText(currentVersionTrackData[fldName]) }); } } else { var prevVersionTrackData = historyInfo[k + 1].TrackDataDictionary; foreach (string fldName in currentVersionTrackData.Keys.Where(ke => !excludeFields.Contains(ke))) { if (!prevVersionTrackData.ContainsKey(fldName) || (prevVersionTrackData.ContainsKey(fldName) && prevVersionTrackData.GetValue(fldName).ToSafeString() != currentVersionTrackData[fldName].ToSafeString())) { var fld = allListFields.FirstOrDefault(f => f.InternalName.Equals(fldName)); if (fld == null) { continue; } vd.Changes.Add(new ChangeInfo { FieldName = fld.DisplayName, FieldValue = fld.GetFieldValueAsText(currentVersionTrackData[fldName]) }); } } } if (vd.Changes.Count() == 0) { vd.Changes.Add(new ChangeInfo { FieldName = "No changes", FieldValue = string.Empty }); } versions.Add(vd); } return(versions); }