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));
        }