using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SqlSugar { public class LogicDeleteProvider where T : class, new() { public DeleteableProvider Deleteable { get; set; } public DeleteBuilder DeleteBuilder { get; set; } public int ExecuteCommand(string LogicFieldName = null,object deleteValue=null,string deleteTimeFieldName = null) { ISqlSugarClient db; List pars; string where; var isAutoDelFilter = DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoDeleteQueryFilter==true&& DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoUpdateQueryFilter == true; if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = false; } LogicFieldName = _ExecuteCommand(LogicFieldName, out db, out where, out pars); if (deleteValue == null) { deleteValue = true; } var updateable = db.Updateable().SetColumns(LogicFieldName, deleteValue); if (deleteTimeFieldName != null) { updateable.SetColumns(deleteTimeFieldName, DateTime.Now); } if (pars != null) updateable.UpdateBuilder.Parameters.AddRange(pars); Convert(updateable as UpdateableProvider); var result = updateable.Where(where).ExecuteCommand(); if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = true; } return result; } public int ExecuteCommand(string LogicFieldName, object deleteValue, string deleteTimeFieldName,string userNameFieldName,object userNameValue) { ISqlSugarClient db; List pars; string where; var isAutoDelFilter = DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoDeleteQueryFilter == true && DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoUpdateQueryFilter == true; if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = false; } LogicFieldName = _ExecuteCommand(LogicFieldName, out db, out where, out pars); var updateable = db.Updateable(); updateable.UpdateBuilder.LambdaExpressions.ParameterIndex = 1000; updateable .SetColumns(LogicFieldName, deleteValue); updateable.SetColumns(deleteTimeFieldName, DateTime.Now); updateable.SetColumns(userNameFieldName,userNameValue); if (pars != null) updateable.UpdateBuilder.Parameters.AddRange(pars); Convert(updateable as UpdateableProvider); var result = updateable.Where(where).ExecuteCommand(); return result; } public async Task ExecuteCommandAsync(string LogicFieldName, object deleteValue, string deleteTimeFieldName, string userNameFieldName, object userNameValue) { ISqlSugarClient db; List pars; string where; var isAutoDelFilter = DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoDeleteQueryFilter == true && DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoUpdateQueryFilter == true; if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = false; } LogicFieldName = _ExecuteCommand(LogicFieldName, out db, out where, out pars); var updateable = db.Updateable(); updateable.UpdateBuilder.LambdaExpressions.ParameterIndex = 1000; updateable.SetColumns(LogicFieldName, deleteValue); updateable.SetColumns(deleteTimeFieldName, DateTime.Now); updateable.SetColumns(userNameFieldName, userNameValue); if (pars != null) updateable.UpdateBuilder.Parameters.AddRange(pars); Convert(updateable as UpdateableProvider); var result =await updateable.Where(where).ExecuteCommandAsync(); return result; } public async Task ExecuteCommandAsync(string LogicFieldName = null, object deleteValue = null, string deleteTimeFieldName = null) { ISqlSugarClient db; List pars; string where; var isAutoDelFilter = DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoDeleteQueryFilter == true && DeleteBuilder.Context?.CurrentConnectionConfig?.MoreSettings?.IsAutoUpdateQueryFilter == true; if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = false; } LogicFieldName = _ExecuteCommand(LogicFieldName, out db, out where, out pars); if (deleteValue == null) { deleteValue = true; } var updateable = db.Updateable().SetColumns(LogicFieldName, deleteValue); if (deleteTimeFieldName != null) { updateable.SetColumns(deleteTimeFieldName, DateTime.Now); } if (pars != null) updateable.UpdateBuilder.Parameters.AddRange(pars); Convert(updateable as UpdateableProvider); var result =await updateable.Where(where).ExecuteCommandAsync(); if (isAutoDelFilter) { DeleteBuilder.Context.CurrentConnectionConfig.MoreSettings.IsAutoUpdateQueryFilter = true; } return result; } private void Convert(UpdateableProvider updateable) { updateable.IsEnableDiffLogEvent = Deleteable.IsEnableDiffLogEvent; updateable.diffModel = Deleteable.diffModel; updateable.UpdateBuilder.TableWithString = DeleteBuilder.TableWithString; updateable.RemoveCacheFunc = Deleteable.RemoveCacheFunc; } private string _ExecuteCommand(string LogicFieldName, out ISqlSugarClient db, out string where, out List pars) { var entityInfo = Deleteable.EntityInfo; db = Deleteable.Context; if (DeleteBuilder.BigDataInValues?.Any() == true) { var sql= db.Queryable().Select("1").AS(nameof(T)).In(DeleteBuilder.BigDataInValues.ToArray()).ToSqlString(); var whereIndex = sql.IndexOf(" WHERE "); var whereItem = sql.Substring(whereIndex+7); this.DeleteBuilder.WhereInfos.Add(whereItem); } Check.ExceptionEasy(DeleteBuilder.GetWhereString == null,"Logical Delete requires a Where condition", "逻辑删除需要加Where条件"); where = DeleteBuilder.GetWhereString.Substring(5); pars = DeleteBuilder.Parameters; if (LogicFieldName.IsNullOrEmpty()) { var column = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualCase("isdelete") || it.PropertyName.EqualCase("isdeleted") || it.DbColumnName.EqualCase("isdelete") || it.DbColumnName.EqualCase("isdeleted")); if (column != null) { LogicFieldName = column.DbColumnName; } } Check.Exception(LogicFieldName == null, ErrorMessage.GetThrowMessage( $"{entityInfo.EntityName} is not isdelete or isdeleted" , $"{entityInfo.EntityName} 没有IsDelete或者IsDeleted 的属性, 你也可以用 IsLogic().ExecuteCommand(\"列名\")")); return LogicFieldName; } } }