using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SqlSugar { public partial class DeleteNavProvider where T : class, new() where Root : class, new() { 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.ExceptionEasy(thisPkColumn == null, $"{thisPkColumn.EntityName} need primary key", $"{thisPkColumn.EntityName}需要主键"); Check.ExceptionEasy(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); Check.ExceptionEasy(mappingA == null || mappingB == null, $"Navigate property {name} error ", $"导航属性{name}配置错误"); 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) .EnableDiffLogEventIF(_RootOptions?.IsDiffLogEvent == true, _RootOptions?.DiffLogBizData) .ExecuteCommand()); } var aids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList(); var bids = _Context.Queryable().Filter(mappingEntity.Type).AS(mappingEntity.DbTableName).In(mappingA.DbColumnName, aids) .Select(mappingB.DbColumnName).ToDataTable() .Rows.Cast().Select(it => it[0]).ToList(); var childList = GetChildList().In(thisPkColumn.DbColumnName, bids).ToList(); if (_WhereList.HasValue()) { bids = childList.Select(it => thisPkColumn.PropertyInfo.GetValue(it)).ToList(); } if (IsDeleteB()) { SetContext(() => _Context.Deleteable(childList).ExecuteCommand()); } this._ParentList = childList.Cast().ToList(); this._ParentPkColumn = thisPkColumn; this._IsDeletedParant = true; if (_WhereList.HasValue()) { SetContext(() => _Context.Deleteable().AS(mappingEntity.DbTableName) .In(mappingA.DbColumnName, aids) .In(mappingB.DbColumnName, bids) .ExecuteCommand()); } else { SetContext(() => _Context.Deleteable().AS(mappingEntity.DbTableName).In( mappingA.DbColumnName, aids ).ExecuteCommand()); } } private bool IsDeleteA() { return deleteNavOptions != null && deleteNavOptions.ManyToManyIsDeleteA; } private bool IsDeleteB() { return deleteNavOptions != null && deleteNavOptions.ManyToManyIsDeleteB; } } }