From 70b9e0561f1dde4edd8c4987f87ade457f9087ae Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 9 Jul 2022 14:25:42 +0800 Subject: [PATCH] Delete nav --- .../ExecuteNavProvider/DeleteNavManyToMany.cs | 52 +++++++++++++++++++ .../ExecuteNavProvider/DeleteNavProvider.cs | 1 + .../ExecuteNavProvider/DeleteNavTask.cs | 18 +++++++ .../SqlSugar/Entities/DeleteNavOptions.cs | 14 +++++ Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 5 files changed, 86 insertions(+) create mode 100644 Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs index ad30f01ae..96b86ff56 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs @@ -10,8 +10,60 @@ namespace SqlSugar { private void DeleteManyToMany(string name, EntityColumnInfo nav) where TChild : class, new() { + var parentEntity = _ParentEntity; + var parentList = _ParentList.Cast().ToList(); + 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(); + + if (IsDeleteA()) + { + if (!_IsDeletedParant) + SetContext(() => this._Context.Deleteable(parentList).ExecuteCommand()); + } + + var aids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList(); + var bids = _Context.Queryable().AS(mappingEntity.DbTableName).In(mappingA.DbColumnName, aids) + .Select(mappingB.DbColumnName).ToDataTable() + .Rows.Cast().Select(it => it[0]).ToList(); + + + var childList = this._Context.Queryable().In(thisPkColumn.DbColumnName, bids).ToList(); + + + if (IsDeleteB()) + { + SetContext(() => _Context.Deleteable(childList).ExecuteCommand()); + } + + this._ParentList = childList.Cast().ToList(); + this._ParentPkColumn = thisPkColumn; + this._IsDeletedParant = true; + + SetContext(() => _Context.Deleteable().AS(mappingEntity.DbTableName).In( + mappingA.DbColumnName, aids + ).ExecuteCommand()); } + private bool IsDeleteA() + { + return deleteNavOptions != null && deleteNavOptions.ManyToMayIsDeleteA; + } + private bool IsDeleteB() + { + return deleteNavOptions != null && deleteNavOptions.ManyToMayIsDeleteB; + } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs index f38d73254..d7edca7f0 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs @@ -9,6 +9,7 @@ namespace SqlSugar { public partial class DeleteNavProvider where T : class, new() where Root : class, new() { + internal DeleteNavOptions deleteNavOptions; public List _Roots { get; set; } public List _ParentList { get; set; } public List _RootList { get; set; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavTask.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavTask.cs index d3433384c..ee4137f9d 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavTask.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavTask.cs @@ -31,6 +31,12 @@ namespace SqlSugar result.Context = this.Context; return result; } + public DeleteNavTask Include(Expression>> expression,DeleteNavOptions deleteNavOptions) where TChild : class, new() + { + var result= Include(expression); + deleteNavProvider.deleteNavOptions = deleteNavOptions; + return result; + } } public class DeleteNavTask where T : class, new() where Root : class, new() { @@ -52,6 +58,18 @@ namespace SqlSugar result.Context = this.Context; return result; } + public DeleteNavTask ThenInclude(Expression>> expression,DeleteNavOptions deleteNavOptions) where TChild : class, new() + { + DeleteNavTask result = new DeleteNavTask(); + Func> func = () => { + var dev = PreFunc(); + dev.deleteNavOptions = deleteNavOptions; + return dev.ThenInclude(expression); + }; + result.PreFunc = func; + result.Context = this.Context; + return result; + } public DeleteNavTask Include(Expression> expression) where TChild : class, new() { return AsNav().ThenInclude(expression); diff --git a/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs b/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs new file mode 100644 index 000000000..e4772cdd2 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Entities/DeleteNavOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class DeleteNavOptions + { + public bool ManyToMayIsDeleteA { get; set; } + public bool ManyToMayIsDeleteB { get; set; } + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 3484e04b4..b7ce6f8d7 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -116,6 +116,7 @@ +