private DataTable GetDataTable(CancellationToken cancel, IProgress <ExecutionProgress> progress, int recordLimit) { DataTable source = SourceData.GetDataTable(cancel, progress); DataTable comparison = ComparisonData.GetDataTable(cancel, progress); DataTable output = CreateOutputTable(source, comparison); progress?.Report(new ExecutionProgress(NotificationType.Information, Properties.Resources.ComparisonDataSourceComparingData)); progress?.Report(new ExecutionProgress(ExecutionStage.Transform, output.Rows.Count, source.Rows.Count + comparison.Rows.Count)); // combine all data tables output.Merge(source, false, MissingSchemaAction.Ignore); comparison.PrimaryKey = null; // todo - unable to do this in child method? output.Merge(comparison, false, MissingSchemaAction.Ignore); foreach (DataRow row in output.Rows) { ComparisonResult comparisonResult = ComparisonResult.Equal; string differenceFields = string.Empty; foreach (FieldMapping mapping in FieldMappings) { if (!Equals(row[mapping.SourceField.ColumnName], row[mapping.ComparisonField.ColumnName])) // todo - column name clashes, etc { comparisonResult = ComparisonResult.Different; differenceFields += differenceFields.Length > 0 ? string.Format(", {0}", mapping.SourceField.ColumnName) : mapping.SourceField.ColumnName; } } row[RESULT_COLUMN_NAME] = comparisonResult.ToString("g"); row[DIFFERENCE_FIELDS_COLUMN_NAME] = !string.IsNullOrEmpty(differenceFields) ? differenceFields : default(string); } progress?.Report(new ExecutionProgress(ExecutionStage.Transform, output.Rows.Count, output.Rows.Count)); return(GetFilteredOutputTable(output)); }