using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace SqlSugar { public class TableDifferenceProvider { internal List tableInfos = new List(); public string ToDiffString() { StringBuilder sb = new StringBuilder(); sb.AppendLine(); var diffTables = this.ToDiffList(); if (diffTables.IsNullOrEmpty()) { sb.AppendLine("No change"); } else { foreach (var item in diffTables) { sb.AppendLine($"----Table:{ item.TableName }----"); if (item.AddColums.HasValue()) { sb.AppendLine($"Add column: "); foreach (var addItem in item.AddColums) { sb.AppendLine($"{addItem.Message} "); } } if (item.UpdateColums.HasValue()) { sb.AppendLine($"Update column: "); foreach (var addItem in item.UpdateColums) { sb.AppendLine($"{addItem.Message} "); } } if (item.DeleteColums.HasValue()) { sb.AppendLine($"Delete column: "); foreach (var addItem in item.DeleteColums) { sb.AppendLine($"{addItem.Message} "); } } } } sb.AppendLine(); sb.AppendLine(); return sb.ToString(); } public List ToDiffList() { List result = new List(); foreach (var tableInfo in tableInfos) { TableDifferenceInfo addItem = new TableDifferenceInfo(); if (tableInfo.OldTableInfo == null) tableInfo.OldTableInfo = new DbTableInfo(); addItem.TableName = tableInfo.OldTableInfo.Name; addItem.AddColums = GetAddColumn(tableInfo); addItem.UpdateColums = GetUpdateColumn(tableInfo); addItem.DeleteColums = GetDeleteColumn(tableInfo); if (addItem.IsDiff) result.Add(addItem); } return result; } private static List GetDeleteColumn(DiffTableInfo tableInfo) { List result = new List(); var columns = tableInfo.OldColumnInfos.Where(z => !tableInfo.NewColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList(); return columns.Select(it => new DiffColumsInfo() { Message= GetColumnString(it) }).ToList(); } private List GetUpdateColumn(DiffTableInfo tableInfo) { List result = new List(); result = tableInfo.NewColumnInfos .Where(z => tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName) && ( z.Length != y.Length || z.ColumnDescription != y.ColumnDescription || z.DataType != y.DataType || z.DecimalDigits != y.DecimalDigits ))).Select(it => new DiffColumsInfo() { Message= GetUpdateColumnString(it, tableInfo.OldColumnInfos.FirstOrDefault(y => y.DbColumnName.EqualCase(it.DbColumnName))) }).ToList(); return result; } private static List GetAddColumn(DiffTableInfo tableInfo) { List result = new List(); var columns = tableInfo.NewColumnInfos.Where(z => !tableInfo.OldColumnInfos.Any(y => y.DbColumnName.EqualCase(z.DbColumnName))).ToList(); return columns.Select(it => new DiffColumsInfo() { Message = GetColumnString(it) }).ToList(); } private static string GetColumnString(DbColumnInfo it) { return $"{it.DbColumnName} {it.DataType} {it.Length} {it.Scale} default:{it.DefaultValue} description:{it.ColumnDescription} pk:{it.IsPrimarykey} nullable:{it.IsNullable} identity:{it.IsIdentity} "; } private static string GetUpdateColumnString(DbColumnInfo it,DbColumnInfo old) { var result= $"{it.DbColumnName} changes: "; if (it.DataType != old.DataType) { result += $" [DataType:{old.DataType}->{it.DataType}] "; } if (it.Length != old.Length) { result += $" [Length:{old.Length}->{it.Length}] "; } if (it.Scale != old.Scale) { result += $" [Scale:{old.Scale}->{it.Scale}] "; } if (it.ColumnDescription != old.ColumnDescription) { result += $" [Description:{old.ColumnDescription}->{it.ColumnDescription}] "; } if (it.IsPrimarykey != old.IsPrimarykey) { result += $" [Pk:{old.IsPrimarykey}->{it.IsPrimarykey}] "; } if (it.IsNullable != old.IsNullable) { result += $" [Nullable:{old.IsNullable}->{it.IsNullable}] "; } if (it.IsIdentity != old.IsIdentity) { result += $" [Identity:{old.IsIdentity}->{it.IsIdentity}] "; } return result; } } public class TableDifferenceInfo { public List DeleteColums { get; set; } = new List(); public List UpdateColums { get; set; } = new List(); public List AddColums { get; set; } = new List(); public List UpdateRemark { get; set; } = new List(); public bool IsDiff { get { return (DeleteColums.Count>0 || UpdateColums.Count > 0 || AddColums.Count > 0 || UpdateRemark.Count > 0) ; } } public string TableName { get; set; } } public class DiffColumsInfo { public string SqlTemplate { get; set; } public string Message { get; set; } } public class DiffTableInfo { public DbTableInfo OldTableInfo { get; set; } public DbTableInfo NewTableInfo { get; set; } public List OldColumnInfos { get; set; } public List NewColumnInfos { get; set; } } }