public List<DiffItem> CheckDifferences(Model.ChargePoint poiA, Model.ChargePoint poiB, bool useObjectCompare = true) { var diffList = new List<DiffItem>(); if (poiA == null && poiB == null) { return diffList; } if (poiA == null && poiB != null) { diffList.Add(new DiffItem { Context = "POI", ValueA = null, ValueB = "New" }); return diffList; } if (poiB == null && poiA != null) { diffList.Add(new DiffItem { Context = "POI", ValueA = "New", ValueB = null }); return diffList; } if (useObjectCompare) { var objectComparison = new CompareLogic(new ComparisonConfig { CompareChildren = true, MaxDifferences = 1000 }); var exclusionList = new string[] { "UUID", "MediaItems", "UserComments", "DateCreated", "DateLastStatusUpdate", ".DataProvider.DateLastImported", ".DataProvider.WebsiteURL", ".DataProvider.DataProviderStatusType", ".DataProvider.Comments", ".DataProvider.License", ".StatusType.IsOperational", ".ConnectionType.FormalName", ".ConnectionType.IsDiscontinued", ".ConnectionType.IsObsolete", ".CurrentType.Description", ".Level.Comments", ".AddressInfoID", ".AddressInfo.ID", ".AddressInfo.Distance", ".AddressInfo.DistanceUnit", ".AddressInfo.DistanceUnit.DistanceUnit", ".SubmissionStatus.IsLive", ".OperatorInfo.WebsiteURL", ".OperatorInfo.PhonePrimaryContact", ".OperatorInfo.IsPrivateIndividual", ".OperatorInfo.ContactEmail", ".OperatorInfo.FaultReportEmail", ".UsageType.IsPayAtLocation", ".UsageType.IsMembershipRequired", ".UsageType.IsAccessKeyRequired", ".DataProvider.DataProviderStatusType.ID", ".DataProvider.DataProviderStatusType.Title" }; objectComparison.Config.MembersToIgnore.AddRange(exclusionList); var comparisonResult = objectComparison.Compare(poiA, poiB); if (!comparisonResult.AreEqual) { //clean up differences we want to exclude foreach (var exclusionSuffix in exclusionList) { comparisonResult.Differences.RemoveAll(e => e.PropertyName.EndsWith(exclusionSuffix)); } diffList.AddRange(comparisonResult.Differences.Select(difference => new DiffItem { Context = difference.PropertyName, ValueA = difference.Object1Value, ValueB = difference.Object2Value })); //remove items which only vary on null vs "" diffList.RemoveAll(d => (String.IsNullOrWhiteSpace(d.ValueA) || d.ValueA == "(null)") && (String.IsNullOrWhiteSpace(d.ValueB) || d.ValueB == "(null)")); //remove items which are in fact the same diffList.RemoveAll(d => d.ValueA == d.ValueB); } } else { //perform non-automate diff check CompareSimpleRefDataItem(diffList, "Data Provider", poiA.DataProviderID, poiB.DataProviderID, (SimpleReferenceDataType)poiA.DataProvider, (SimpleReferenceDataType)poiB.DataProvider); CompareSimpleRefDataItem(diffList, "Network/Operator", poiA.OperatorID, poiB.OperatorID, poiA.OperatorInfo, poiB.OperatorInfo); CompareSimpleRefDataItem(diffList, "Operational Status", poiA.StatusTypeID, poiB.StatusTypeID, poiA.StatusType, poiB.StatusType); CompareSimpleRefDataItem(diffList, "Usage Type", poiA.UsageTypeID, poiB.UsageTypeID, poiA.UsageType, poiB.UsageType); CompareSimpleRefDataItem(diffList, "Submission Status", poiA.SubmissionStatusTypeID, poiB.SubmissionStatusTypeID, poiA.SubmissionStatus, poiB.SubmissionStatus); CompareSimpleProperty(diffList, "Data Providers Reference", poiA.DataProvidersReference, poiB.DataProvidersReference); CompareSimpleProperty(diffList, "Data Quality Level", poiA.DataQualityLevel, poiB.DataQualityLevel); CompareSimpleProperty(diffList, "Number Of Points", poiA.NumberOfPoints, poiB.NumberOfPoints); CompareSimpleProperty(diffList, "Usage Cost", poiA.UsageCost, poiB.UsageCost); CompareSimpleProperty(diffList, "Address", poiA.GetAddressSummary(false, true), poiB.GetAddressSummary(false, true)); CompareSimpleProperty(diffList, "General Comments", poiA.GeneralComments, poiB.GeneralComments); CompareSimpleProperty(diffList, "Address : Access Comments", poiA.AddressInfo.AccessComments, poiB.AddressInfo.AccessComments); } return diffList; }