From 69080be4a6626ed255d064d59f288e658ae2aa34 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 16 Jul 2022 17:02:48 +0800 Subject: [PATCH] Add db.UpdateNav(list) --- .../ExecuteNavProvider/UpdateInsert.cs | 41 ------ .../ExecuteNavProvider/UpdateNavManyToMany.cs | 78 ++++++++++ .../ExecuteNavProvider/UpdateNavOneToMany.cs | 69 +++++++++ .../ExecuteNavProvider/UpdateNavOneToOne.cs | 64 ++++++++ .../ExecuteNavProvider/UpdateNavProvider.cs | 79 ++++++++++ .../UpdateNavProviderHelper.cs | 137 ++++++++++++++++++ .../ExecuteNavProvider/UpdateNavTask.cs | 99 +++++++++++++ .../SugarProvider/SqlSugarProvider.cs | 12 +- .../SugarProvider/SqlSugarScopeProvider.cs | 4 +- .../SqlSugar/Interface/ISqlSugarClient.cs | 4 +- Src/Asp.Net/SqlSugar/SqlSugar.csproj | 7 +- Src/Asp.Net/SqlSugar/SqlSugarClient.cs | 4 +- Src/Asp.Net/SqlSugar/SqlSugarScope.cs | 4 +- 13 files changed, 547 insertions(+), 55 deletions(-) delete mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateInsert.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavManyToMany.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToOne.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs create mode 100644 Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavTask.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateInsert.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateInsert.cs deleted file mode 100644 index f1904cbac..000000000 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateInsert.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using System.Threading.Tasks; - -namespace SqlSugar -{ - public class UpdateNavProvider - { - - public List Roots { get; set; } - public SqlSugarProvider Context { get; internal set; } - - public UpdateNavProvider ThenInclude(Expression> expression) - { - throw new Exception("开发中7月15号之前上线"); - } - public UpdateNavProvider Include(Expression> expression) - { - throw new Exception("开发中7月15号之前上线"); - } - public UpdateNavProvider ThenInclude(Expression>> expression) - { - throw new Exception("开发中7月15号之前上线"); - } - public UpdateNavProvider Include(Expression>> expression) - { - throw new Exception("开发中7月15号之前上线"); - } - public bool ExecuteCommand() - { - return true; - } - private UpdateNavProvider AsNav() - { - return null; - } - } -} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavManyToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavManyToMany.cs new file mode 100644 index 000000000..9b7534cef --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavManyToMany.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +namespace SqlSugar +{ + public partial class UpdateNavProvider where T : class, new() where Root : class, new() + { + private void UpdateManyToMany(string name, EntityColumnInfo nav) where TChild : class, new() + { + ; + var parentEntity = _ParentEntity; + var parentList = _ParentList; + var parentPkColumn = parentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); + var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name); + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(); + var thisPkColumn = thisEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); + Check.Exception(thisPkColumn == null, $"{thisPkColumn.EntityName} need primary key", $"{thisPkColumn.EntityName}需要主键"); + Check.Exception(parentPkColumn == null, $"{parentPkColumn.EntityName} need primary key", $"{parentPkColumn.EntityName}需要主键"); + var mappingType = parentNavigateProperty.Navigat.MappingType; + var mappingEntity = this._Context.EntityMaintenance.GetEntityInfo(mappingType); + var mappingA = mappingEntity.Columns.FirstOrDefault(x => x.PropertyName == parentNavigateProperty.Navigat.MappingAId); + var mappingB = mappingEntity.Columns.FirstOrDefault(x => x.PropertyName == parentNavigateProperty.Navigat.MappingBId); + var mappingPk = mappingEntity.Columns + .Where(it => it.PropertyName != mappingA.PropertyName) + .Where(it => it.PropertyName != mappingB.PropertyName) + .Where(it => it.IsPrimarykey && !it.IsIdentity && it.OracleSequenceName.IsNullOrEmpty()).FirstOrDefault(); + Check.Exception(mappingA == null || mappingB == null, $"Navigate property {name} error ", $"导航属性{name}配置错误"); + List> mappgingTables = new List>(); + foreach (var item in parentList) + { + var items = parentNavigateProperty.PropertyInfo.GetValue(item); + var children = ((List)items); + InsertDatas(children, thisPkColumn); + var parentId = parentPkColumn.PropertyInfo.GetValue(item); + foreach (var child in children) + { + var chidId = thisPkColumn.PropertyInfo.GetValue(child); + Dictionary keyValuePairs = new Dictionary(); + keyValuePairs.Add(mappingA.DbColumnName, parentId); + keyValuePairs.Add(mappingB.DbColumnName, chidId); + if (mappingPk != null) + { + SetMappingTableDefaultValue(mappingPk, keyValuePairs); + } + mappgingTables.Add(keyValuePairs); + } + } + var ids = mappgingTables.Select(x => x[mappingA.DbColumnName]).ToList(); + this._Context.Deleteable().AS(mappingEntity.DbTableName).In(mappingA.DbColumnName, ids).ExecuteCommand(); + this._Context.Insertable(mappgingTables).AS(mappingEntity.DbTableName).ExecuteCommand(); + } + + private void SetMappingTableDefaultValue(EntityColumnInfo mappingPk, Dictionary keyValuePairs) + { + if (mappingPk.UnderType == UtilConstants.LongType) + { + keyValuePairs.Add(mappingPk.DbColumnName, SnowFlakeSingle.Instance.NextId()); + } + else if (mappingPk.UnderType == UtilConstants.GuidType) + { + keyValuePairs.Add(mappingPk.DbColumnName, Guid.NewGuid()); + } + else if (mappingPk.UnderType == UtilConstants.StringType) + { + keyValuePairs.Add(mappingPk.DbColumnName, Guid.NewGuid() + ""); + } + else + { + var name = mappingPk.EntityName + " " + mappingPk.DbColumnName; + Check.ExceptionEasy($"The field {name} is not an autoassignment type and requires an assignment", + $" 中间表主键字段{name}不是可自动赋值类型, 可赋值类型有 自增、long、Guid、string。你也可以删掉主键 用双主键"); + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs new file mode 100644 index 000000000..56019274f --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToMany.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +namespace SqlSugar +{ + public partial class UpdateNavProvider where T : class, new() where Root : class, new() + { + + private void UpdateOneToMany(string name, EntityColumnInfo nav) where TChild : class, new() + { + List children = new List(); + var parentEntity = _ParentEntity; + var parentList = _ParentList; + var parentNavigateProperty = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == name); + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(); + var thisPkColumn = GetPkColumnByNav(thisEntity, nav); + var thisFkColumn = GetFKColumnByNav(thisEntity, nav); + EntityColumnInfo parentPkColumn = GetParentPkColumn(); + EntityColumnInfo parentNavColumn = GetParentPkNavColumn(nav); + if (parentNavColumn != null) + { + parentPkColumn = parentNavColumn; + } + foreach (var item in parentList) + { + var parentValue = parentPkColumn.PropertyInfo.GetValue(item); + var childs = parentNavigateProperty.PropertyInfo.GetValue(item) as List; + if (childs != null) + { + foreach (var child in childs) + { + thisFkColumn.PropertyInfo.SetValue(child, parentValue, null); + } + children.AddRange(childs); + } + } + InsertDatas(children, thisPkColumn); + SetNewParent(thisEntity, thisPkColumn); + } + + private EntityColumnInfo GetParentPkColumn() + { + EntityColumnInfo parentPkColumn = _ParentPkColumn; + if (_ParentPkColumn == null) + { + parentPkColumn = _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey); + } + return parentPkColumn; + } + private EntityColumnInfo GetParentPkNavColumn(EntityColumnInfo nav) + { + EntityColumnInfo result = null; + if (nav.Navigat.Name2.HasValue()) + { + result = _ParentPkColumn = this._ParentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2); + } + return result; + } + + private void SetNewParent(EntityInfo entityInfo, EntityColumnInfo entityColumnInfo) where TChild : class, new() + { + this._ParentEntity = entityInfo; + this._ParentPkColumn = entityColumnInfo; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToOne.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToOne.cs new file mode 100644 index 000000000..88147a9ea --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavOneToOne.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +namespace SqlSugar +{ + public partial class UpdateNavProvider where T : class, new() where Root : class, new() + { + private void UpdateOneToOne(string name, EntityColumnInfo nav) where TChild : class, new() + { + var parentEntity = _ParentEntity; + var parentList = _ParentList; + var parentColumn = parentEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); + var parentPkColumn = parentEntity.Columns.FirstOrDefault(it => it.IsPrimarykey); + var thisEntity = this._Context.EntityMaintenance.GetEntityInfo(); + EntityColumnInfo thisPkColumn = GetPkColumnByNav(thisEntity, nav); + Check.Exception(thisPkColumn == null, $" Navigate {parentEntity.EntityName} : {name} is error ", $"导航实体 {parentEntity.EntityName} 属性 {name} 配置错误"); + List childList = new List(); + foreach (var parent in parentList) + { + var navPropertyValue = parentColumn.PropertyInfo.GetValue(parent); + var childItem = (TChild)nav.PropertyInfo.GetValue(parent); + if (childItem != null) + { + if (IsDefaultValue(navPropertyValue)) + { + var pkValue = thisPkColumn.PropertyInfo.GetValue(childItem); + if (IsDefaultValue(navPropertyValue)) + { + navPropertyValue = pkValue; + } + + } + if (!IsDefaultValue(navPropertyValue)) + { + this._Context.Updateable + ().AS(parentEntity.DbTableName) + .SetColumns(parentColumn.DbColumnName, navPropertyValue) + .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand(); + } + if (IsDefaultValue(navPropertyValue)) + { + InsertDatas(new List() { childItem }, thisPkColumn); + navPropertyValue = thisPkColumn.PropertyInfo.GetValue(childItem); + parentColumn.PropertyInfo.SetValue(parent, navPropertyValue); + this._Context.Updateable + ().AS(parentEntity.DbTableName) + .SetColumns(parentColumn.DbColumnName, navPropertyValue) + .Where(parentPkColumn.DbColumnName, "=", parentPkColumn.PropertyInfo.GetValue(parent)).ExecuteCommand(); + } + + thisPkColumn.PropertyInfo.SetValue(childItem, navPropertyValue); + childList.Add(childItem); + } + } + InsertDatas(childList, thisPkColumn); + this._ParentList = childList.Cast().ToList(); + SetNewParent(thisEntity, thisPkColumn); + } + + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs new file mode 100644 index 000000000..9bb718a5e --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProvider.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class UpdateNavProvider where T : class, new() where Root : class, new() + { + + public List _Roots { get; set; } + public List _ParentList { get; set; } + public List _RootList { get; set; } + public EntityInfo _ParentEntity { get; set; } + public EntityColumnInfo _ParentPkColumn { get; set; } + public SqlSugarProvider _Context { get; set; } + + + public UpdateNavProvider AsNav() + { + return new UpdateNavProvider + { + _Context = _Context, + _ParentEntity = null, + _ParentList = null, + _Roots = _Roots, + _ParentPkColumn = this._Context.EntityMaintenance.GetEntityInfo().Columns.First(it => it.IsPrimarykey) + }; + } + public UpdateNavProvider ThenInclude(Expression> expression) where TChild : class, new() + { + InitParentList(); + var name = ExpressionTool.GetMemberName(expression); + var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); + if (nav.Navigat == null) + { + Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); + } + if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) + { + UpdateOneToOne(name, nav); + } + else if (nav.Navigat.NavigatType == NavigateType.OneToMany) + { + UpdateOneToMany(name, nav); + } + else + { + UpdateManyToMany(name, nav); + } + return GetResult(); + } + public UpdateNavProvider ThenInclude(Expression>> expression) where TChild : class, new() + { + InitParentList(); + var name = ExpressionTool.GetMemberName(expression); + var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); + if (nav.Navigat == null) + { + Check.ExceptionEasy($"{name} no navigate attribute", $"{this._ParentEntity.EntityName}的属性{name}没有导航属性"); + } + if (nav.Navigat.NavigatType == NavigateType.OneToOne || nav.Navigat.NavigatType == NavigateType.ManyToOne) + { + UpdateOneToOne(name, nav); + } + else if (nav.Navigat.NavigatType == NavigateType.OneToMany) + { + UpdateOneToMany(name, nav); + } + else + { + UpdateManyToMany(name, nav); + } + return GetResult(); + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs new file mode 100644 index 000000000..77b902e07 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavProviderHelper.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class UpdateNavProvider where T : class, new() where Root : class, new() + { + + private static bool IsDefaultValue(object pvValue) + { + return pvValue == null || pvValue.Equals(UtilMethods.GetDefaultValue(pvValue.GetType())); + } + private void InitParentList() + { + if (_RootList == null) + { + _RootList = _ParentList = GetRootList(_Roots).Cast().ToList(); + } + else if (_ParentList == null) + { + _ParentList = _RootList; + var pkColumn = this._Context.EntityMaintenance.GetEntityInfo().Columns.FirstOrDefault(it => it.IsPrimarykey); + this._ParentPkColumn = pkColumn; + } + + } + + private UpdateNavProvider GetResult() where TChild : class, new() + { + return new UpdateNavProvider() + { + _Context = this._Context, + _ParentEntity = this._ParentEntity, + _ParentList = this._ParentList, + _Roots = this._Roots, + _ParentPkColumn = this._ParentPkColumn, + _RootList = this._RootList + }; + } + + private List GetRootList(List datas) where Type : class, new() + { + List result = new List(); + this._Context.InitMappingInfo(); + var entity = this._Context.EntityMaintenance.GetEntityInfo(); + var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey); + InsertDatas(datas, pkColumn); + this._ParentEntity = entity; + result = datas; + return result; + } + + private void InsertIdentity(List datas) where Type : class, new() + { + foreach (var item in datas) + { + this._Context.Insertable(item).ExecuteCommandIdentityIntoEntity(); + } + } + + private EntityColumnInfo GetPkColumnByNav(EntityInfo entity, EntityColumnInfo nav) + { + var pkColumn = entity.Columns.FirstOrDefault(it => it.IsPrimarykey == true); + if (nav.Navigat.Name2.HasValue()) + { + pkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name2); + } + return pkColumn; + } + private EntityColumnInfo GetFKColumnByNav(EntityInfo entity, EntityColumnInfo nav) + { + var fkColumn = entity.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); + return fkColumn; + } + private void InsertDatas(List children, EntityColumnInfo pkColumn, EntityColumnInfo NavColumn = null) where TChild : class, new() + { + children = children.Distinct().ToList(); + var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).ToStorage(); + var UpdateData = children = x.UpdateList.Select(it => it.Item).ToList(); + Check.ExceptionEasy(pkColumn == null && NavColumn == null, $"The entity is invalid", $"实体错误无法使用导航"); + InitData(pkColumn, UpdateData); + this._ParentList = children.Cast().ToList(); + } + + private void InitData(EntityColumnInfo pkColumn, List UpdateData) where TChild : class, new() + { + if (pkColumn.IsIdentity || pkColumn.OracleSequenceName.HasValue()) + { + InsertIdentity(UpdateData); + } + else if (pkColumn.UnderType == UtilConstants.LongType) + { + SetValue(pkColumn, UpdateData, () => SnowFlakeSingle.Instance.NextId()); + } + else if (pkColumn.UnderType == UtilConstants.GuidType) + { + SetValue(pkColumn, UpdateData, () => Guid.NewGuid()); + } + else if (pkColumn.UnderType == UtilConstants.StringType) + { + SetValue(pkColumn, UpdateData, () => Guid.NewGuid().ToString()); + } + else + { + SetError(pkColumn, UpdateData); + } + } + + private void SetValue(EntityColumnInfo pkColumn, List UpdateData, Func value) where TChild : class, new() + { + foreach (var child in UpdateData) + { + if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child))) + { + pkColumn.PropertyInfo.SetValue(child, value()); + } + } + this._Context.Updateable(UpdateData).ExecuteCommand(); + } + private void SetError(EntityColumnInfo pkColumn, List UpdateData) where TChild : class, new() + { + foreach (var child in UpdateData) + { + if (IsDefaultValue(pkColumn.PropertyInfo.GetValue(child))) + { + var name = pkColumn.EntityName + " " + pkColumn.DbColumnName; + Check.ExceptionEasy($"The field {name} is not an autoassignment type and requires an assignment", $"字段{name}不是可自动赋值类型,需要赋值 , 可赋值类型有 自增、long、Guid、string"); + } + } + this._Context.Updateable(UpdateData).ExecuteCommand(); + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavTask.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavTask.cs new file mode 100644 index 000000000..1a6a5c9b5 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/UpdateNavTask.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class UpdateNavTaskInit where T : class, new() where Root : class, new() + { + + internal SqlSugarProvider Context { get; set; } + internal UpdateNavProvider UpdateNavProvider { get; set; } + + public UpdateNavTask Include(Expression> expression) where TChild : class, new() + { + this.Context = UpdateNavProvider._Context; + UpdateNavTask result = new UpdateNavTask(); + Func> func = () => UpdateNavProvider.ThenInclude(expression); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public UpdateNavTask Include(Expression>> expression) where TChild : class, new() + { + this.Context = UpdateNavProvider._Context; + UpdateNavTask result = new UpdateNavTask(); + Func> func = () => UpdateNavProvider.ThenInclude(expression); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + } + public class UpdateNavTask where T : class, new() where Root : class, new() + { + public SqlSugarProvider Context { get; set; } + public Func> PreFunc { get; set; } + public UpdateNavTask ThenInclude(Expression> expression) where TChild : class, new() + { + UpdateNavTask result = new UpdateNavTask(); + Func> func = () => PreFunc().ThenInclude(expression); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public UpdateNavTask ThenInclude(Expression>> expression) where TChild : class, new() + { + UpdateNavTask result = new UpdateNavTask(); + Func> func = () => PreFunc().ThenInclude(expression); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + public UpdateNavTask Include(Expression> expression) where TChild : class, new() + { + return AsNav().ThenInclude(expression); + } + public UpdateNavTask Include(Expression>> expression) where TChild : class, new() + { + return AsNav().ThenInclude(expression); + } + public bool ExecuteCommand() + { + var hasTran = this.Context.Ado.Transaction != null; + if (hasTran) + { + PreFunc(); + } + else + { + this.Context.Ado.UseTran(() => + { + PreFunc(); + }, ex => throw ex); + } + return true; + } + public async Task ExecuteCommandAsync() + { + await Task.Run(async () => + { + ExecuteCommand(); + await Task.Delay(0); + }); + return true; + } + + private UpdateNavTask AsNav() + { + UpdateNavTask result = new UpdateNavTask(); + Func> func = () => PreFunc().AsNav(); + result.PreFunc = func; + result.Context = this.Context; + return result; + } + } + +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index e0da932a4..ed04d361f 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -920,15 +920,17 @@ namespace SqlSugar { return DeleteNav(this.Queryable().Where(whereExpression).ToList()); } - public UpdateNavProvider UpdateNav(T data) + public UpdateNavTaskInit UpdateNav(T data) where T : class, new() { return UpdateNav(new List() { data }); } - public UpdateNavProvider UpdateNav(List datas) + public UpdateNavTaskInit UpdateNav(List datas) where T : class, new() { - var result = new UpdateNavProvider(); - result.Roots = datas; - result.Context = this; + var result = new UpdateNavTaskInit(); + var provider = new UpdateNavProvider(); + provider._Roots = datas; + provider._Context = this; + result.UpdateNavProvider = provider; return result; } #endregion diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index 5351c2f87..09912030a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -698,11 +698,11 @@ namespace SqlSugar { return ScopedContext.DeleteNav(whereExpression); } - public UpdateNavProvider UpdateNav(T data) + public UpdateNavTaskInit UpdateNav(T data) where T : class, new() { return ScopedContext.UpdateNav(data); } - public UpdateNavProvider UpdateNav(List datas) + public UpdateNavTaskInit UpdateNav(List datas) where T : class, new() { return ScopedContext.UpdateNav(datas); } diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs index d6adad96b..eed0bb298 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs @@ -208,8 +208,8 @@ namespace SqlSugar DeleteNavTaskInit DeleteNav(T data) where T : class, new(); DeleteNavTaskInit DeleteNav(List datas) where T : class, new(); DeleteNavTaskInit DeleteNav(Expression> whereExpression) where T : class, new(); - UpdateNavProvider UpdateNav(T data); - UpdateNavProvider UpdateNav(List datas); + UpdateNavTaskInit UpdateNav(T data) where T : class, new (); + UpdateNavTaskInit UpdateNav(List datas) where T : class, new (); #endregion } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 3c37b8af0..6181cd19e 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -89,6 +89,11 @@ + + + + + @@ -99,7 +104,7 @@ - + diff --git a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs index 71b105068..3fe9e357d 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs @@ -174,11 +174,11 @@ namespace SqlSugar { return this.Context.DeleteNav(whereExpression); } - public UpdateNavProvider UpdateNav(T data) + public UpdateNavTaskInit UpdateNav(T data) where T : class, new() { return this.Context.UpdateNav(data); } - public UpdateNavProvider UpdateNav(List datas) + public UpdateNavTaskInit UpdateNav(List datas) where T : class, new() { return this.Context.UpdateNav(datas); } diff --git a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs index e4cd6924b..babe3cd83 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs @@ -754,11 +754,11 @@ namespace SqlSugar { return ScopedContext.DeleteNav(whereExpression); } - public UpdateNavProvider UpdateNav(T data) + public UpdateNavTaskInit UpdateNav(T data) where T : class, new() { return ScopedContext.UpdateNav(data); } - public UpdateNavProvider UpdateNav(List datas) + public UpdateNavTaskInit UpdateNav(List datas) where T : class, new() { return ScopedContext.UpdateNav(datas); }