internal DataTable GetResultsDataTable() { if (DataTables.Count < 2) { throw new Exception("Must have at least 2 tables added to compare"); } List <DataTable> dtsTemp = new List <DataTable>(); List <DataTable> dts = new List <DataTable>(); DataTable dtResult = new DataTable(); dtResult.CaseSensitive = Config.DataFieldValuesCaseSensitive; DataTables.CopyTo(dts); foreach (DataTable dt in dts) { dtsTemp.Add(dt); } if (dts != null && dts.Count() > 0) { DataTable dtTemp = new DataTable(); List <DataTable> dtsCopy = new List <DataTable>(); dts.CopyTo(dtsCopy); foreach (DataTable dt in dtsCopy) { dt.AddColumnIfNotExists(Config.ExistsInColumnNamePrefix, typeof(string)); foreach (DataRow r in dt.Rows) { r[Config.ExistsInColumnNamePrefix] = "Yes"; } } DataColumn[] keys = new DataColumn[dtsCopy[0].PrimaryKey.Length]; for (int i = 0; i < dtsCopy[0].PrimaryKey.Length; i++) { try { Type t = dtsCopy[0].PrimaryKey[i].DataType; dtResult.AddColumnIfNotExists(dtsCopy[0].PrimaryKey[i].ColumnName, t);//typeof(string)); keys[i] = dtResult.Columns[dtsCopy[0].PrimaryKey[i].ColumnName]; //// result.CommonKeyColumnNames.Add(dtsCopy[0].PrimaryKey[i].ColumnName); } catch (Exception ex) { throw ex; } } dtResult.PrimaryKey = keys; List <string> tableNames = new List <string>(); List <string> commonNonKeyColumns = dtsCopy.GetColumnNames_Shared_NonPrimaryKey().ToList(); List <string> uniqueNonKeyColumns = dtsCopy.GetColumnNames_NotShared_NonPrimaryKey().ToList(); foreach (DataTable dt in dtsCopy) { tableNames.Add(dt.TableName); foreach (DataColumn col in dt.Columns) { col.AllowDBNull = true; if (commonNonKeyColumns.IndexOf(col.ColumnName) >= 0) { col.ColumnName = col.ColumnName + Config.WordSeperator + dt.TableName; } } foreach (DataColumn col in dtResult.Columns) { col.AllowDBNull = true; } try { dtResult.Merge(dt); } catch (Exception ex) { dtResult.Merge(dt, true, MissingSchemaAction.AddWithKey); throw ex; } } string expression = GetKeyStatusExpression(dtsCopy); dtResult.AddColumnIfNotExists($"{Config.ExistsInColumnNamePrefix}{Config.WordSeperator}Status", typeof(string), expression); foreach (string commonNonKeyColumn in commonNonKeyColumns) { expression = GetNonKeyStatusExpression(dtsCopy, commonNonKeyColumn, dtResult); if (expression != "") { dtResult.AddColumnIfNotExists($"{commonNonKeyColumn}{Config.WordSeperator}Status", typeof(string), expression, false); } } commonNonKeyColumns.Remove(Config.ExistsInColumnNamePrefix); foreach (string commonNonKeyColumn in commonNonKeyColumns) { foreach (string tableName in tableNames) { dtResult.SetColumnOrdinalIfExists(commonNonKeyColumn + Config.WordSeperator + tableName, dtResult.Columns.Count - 1); } } foreach (string uniqueNonKeyColumn in uniqueNonKeyColumns) { foreach (DataTable dt in dtsCopy) { if (Config.IncludeUniqueColumnsInOutput) { if (dt.Columns.Contains(uniqueNonKeyColumn)) { dtResult.SetColumnOrdinalIfExists(uniqueNonKeyColumn, dtResult.Columns.Count - 1); dtResult.RenameColumnIfExists(uniqueNonKeyColumn, uniqueNonKeyColumn + " " + dt.TableName); } } else { dtResult.DeleteColumnIfExists(uniqueNonKeyColumn); } } } dtResult.TableName = (dtResult.Namespace + " Comparison Results").Trim(); dtResult.AcceptChanges(); dtsTemp.Clear(); } return(dtResult); }