using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace SqlSugar { public class DeleteNavTaskInit where T : class, new() where Root : class, new() { internal List Roots { get; set; } internal SqlSugarProvider Context { get; set; } internal DeleteNavProvider deleteNavProvider { get; set; } public DeleteNavMethodInfo IncludesAllFirstLayer(params string[] ignoreColumns) { if (ignoreColumns == null) { ignoreColumns = new string[] { }; } this.Context = deleteNavProvider._Context; var navColumns = this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => !ignoreColumns.Contains(it.PropertyName) || !ignoreColumns.Any(z => z.EqualCase(it.DbColumnName))).Where(it => it.Navigat != null).ToList(); var updateNavs = this; DeleteNavMethodInfo methodInfo = updateNavs.IncludeByNameString(navColumns[0].PropertyName); foreach (var item in navColumns.Skip(1)) { methodInfo = methodInfo.IncludeByNameString(item.PropertyName); } return methodInfo; } public DeleteNavTask Include(Expression> expression) where TChild : class, new() { this.Context = deleteNavProvider._Context; DeleteNavTask result = new DeleteNavTask(); Func> func = () => deleteNavProvider.ThenInclude(expression); result.PreFunc = func; result.Context = this.Context; return result; } public DeleteNavMethodInfo IncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null) { DeleteNavMethodInfo result = new DeleteNavMethodInfo(); result.Context = deleteNavProvider._Context; var entityInfo = result.Context.EntityMaintenance.GetEntityInfo(); Type properyItemType; bool isList; Expression exp = UtilMethods.GetIncludeExpression(navMemberName, entityInfo, out properyItemType, out isList); var method = this.GetType().GetMyMethod("Include", 2, isList) .MakeGenericMethod(properyItemType); var obj = method.Invoke(this, new object[] { exp, updateNavOptions }); result.MethodInfos = obj; return result; } public DeleteNavTask Include(Expression>> expression) where TChild : class, new() { this.Context = deleteNavProvider._Context; DeleteNavTask result = new DeleteNavTask(); Func> func = () => deleteNavProvider.ThenInclude(expression); result.PreFunc = func; 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() { public SqlSugarProvider Context { get; set; } public Func> PreFunc { get; set; } public DeleteNavTask ThenInclude(Expression> expression) where TChild : class, new() { DeleteNavTask result = new DeleteNavTask(); Func> func = () => PreFunc().ThenInclude(expression); result.PreFunc = func; 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 ThenInclude(Expression>> expression) where TChild : class, new() { DeleteNavTask result = new DeleteNavTask(); Func> func = () => PreFunc().ThenInclude(expression); result.PreFunc = func; 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); } public DeleteNavTask Include(Expression> expression, DeleteNavOptions options) where TChild : class, new() { return AsNav().ThenInclude(expression,options); } public DeleteNavTask Include(Expression>> expression) where TChild : class, new() { return AsNav().ThenInclude(expression); } public DeleteNavTask Include(Expression>> expression,DeleteNavOptions options) where TChild : class, new() { return AsNav().ThenInclude(expression, options); } public bool ExecuteCommand() { PreFunc(); var hasTran = this.Context.Ado.Transaction != null; if (hasTran) { ExecTasks(); } else { this.Context.Ado.UseTran(() => { ExecTasks(); }, ex => throw ex); } return true; } public async Task ExecuteCommandAsync() { await Task.Run(async () => { ExecuteCommand(); await Task.Delay(0); }); return true; } private DeleteNavTask AsNav() { DeleteNavTask result = new DeleteNavTask(); Func> func = () => PreFunc().AsNav(); result.PreFunc = func; result.Context = this.Context; return result; } private void ExecTasks() { var tasks=(List)this.Context.TempItems["_DeleteNavTask"]; tasks.Reverse(); foreach (var task in tasks) { task(); } this.Context.TempItems.Remove("_DeleteNavTask"); } } }