diff --git a/Src/Asp.Net/SqlSugar/Abstract/GridSave/GridSaveProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/GridSave/GridSaveProvider.cs new file mode 100644 index 000000000..fc16d6824 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/GridSave/GridSaveProvider.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class GridSaveProvider where T : class, new() + { + internal SqlSugarProvider Context { get; set; } + internal List OldList { get; set; } + internal List SaveList { get; set; } + public bool ExecuteCommand() + { + var deleteList = GetDeleteList(); + this.Context.Deleteable(deleteList).PageSize(1000).ExecuteCommand(); + this.Context.Storageable(SaveList).PageSize(1000).ExecuteCommand(); + return true; + } + public async Task ExecuteCommandAsync() + { + var deleteList= GetDeleteList(); + await this.Context.Deleteable(deleteList).PageSize(1000).ExecuteCommandAsync(); + await this.Context.Storageable(SaveList).PageSize(1000).ExecuteCommandAsync(); + return true; + } + + public List GetDeleteList() + { + string[] primaryKeys = this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey).Select(it => it.PropertyName).ToArray(); + var saveListDictionary = this.SaveList.ToDictionary(item => CreateCompositeKey(primaryKeys, item)); + var deleteList = this.OldList.Where(oldItem => + { + var compositeKey = CreateCompositeKey(primaryKeys, oldItem); + return !saveListDictionary.ContainsKey(compositeKey); + }).ToList(); + return deleteList; + } + + private string CreateCompositeKey(string[] propertyNames, object obj) + { + var keyValues = propertyNames.Select(propertyName => GetPropertyValue(obj, propertyName)?.ToString() ?? ""); + return string.Join("|", keyValues); + } + + private object GetPropertyValue(object obj, string propertyName) + { + var property = obj.GetType().GetProperty(propertyName); + return property != null ? property.GetValue(obj) : null; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index cfe39ddef..7f14939dd 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -1006,6 +1006,14 @@ namespace SqlSugar #endregion #region Saveable + public GridSaveProvider GridSave(List oldList, List saveList) where T : class, new() + { + GridSaveProvider result = new GridSaveProvider(); + result.Context = this; + result.OldList = oldList; + result.SaveList = saveList; + return result; + } public IStorageable Storageable(T[] dataList) where T : class, new() { return Storageable(dataList?.ToList()); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index 0e6a3e894..2ecfac7be 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -827,6 +827,10 @@ namespace SqlSugar { return ScopedContext.QueryableByObject(entityType, shortName); } + public GridSaveProvider GridSave(List oldList, List saveList) where T : class, new() + { + return ScopedContext.GridSave(oldList, saveList); + } #endregion } } \ No newline at end of file diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs index 5dfe6654e..a02e8f1f0 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs @@ -146,6 +146,7 @@ namespace SqlSugar #endregion #region Saveable + GridSaveProvider GridSave(List oldList,List saveList) where T : class, new(); IStorageable Storageable(T[] dataList) where T : class, new(); StorageableDataTable Storageable(List> dictionaryList, string tableName); StorageableDataTable Storageable(Dictionary dictionary, string tableName); diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index db0a6ce39..684f6357e 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -122,6 +122,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs index 8d1ace12e..70574f953 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs @@ -535,6 +535,10 @@ namespace SqlSugar #endregion #region Saveable + public GridSaveProvider GridSave(List oldList, List saveList) where T : class, new() + { + return this.Context.GridSave(oldList, saveList); + } public StorageableDataTable Storageable(DataTable data) { return this.Context.Storageable(data); diff --git a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs index 1ae38c0a9..b1b05eb67 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs @@ -894,5 +894,9 @@ namespace SqlSugar { return ScopedContext.QueryableByObject(entityType, shortName); } + public GridSaveProvider GridSave(List oldList, List saveList) where T : class, new() + { + return ScopedContext.GridSave(oldList, saveList); + } } }