using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace SqlSugar { public class InsertNavTaskInit where T : class, new() where Root : class, new() { internal SqlSugarProvider Context { get; set; } internal InsertNavProvider insertNavProvider { get; set; } internal NavContext NavContext { get; set; } public InsertNavTask Include(Expression> expression) where TChild : class, new() { this.Context = insertNavProvider._Context; insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression>> expression) where TChild : class, new() { this.Context = insertNavProvider._Context; insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression,InsertNavOptions options) where TChild : class, new() { this.Context = insertNavProvider._Context; insertNavProvider.NavContext = this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression>> expression, InsertNavOptions options) where TChild : class, new() { this.Context = insertNavProvider._Context; insertNavProvider.NavContext =this.NavContext; InsertNavTask result = new InsertNavTask(); Func> func = () => insertNavProvider.ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } } public class InsertNavTask where T : class, new() where Root : class, new() { public SqlSugarProvider Context { get; set; } public Func> PreFunc { get; set; } internal NavContext NavContext { get; set; } public InsertNavTask ThenInclude(Expression> expression) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); Func> func = () => { var nav = PreFunc().ThenInclude(expression); nav.NavContext = this.NavContext; return nav; }; result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask ThenInclude(Expression>> expression) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); Func> func = () => { var nav = PreFunc().ThenInclude(expression); nav.NavContext = this.NavContext; return nav; }; result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression) where TChild : class, new() { return AsNav().ThenInclude(expression); } public InsertNavTask Include(Expression>> expression) where TChild : class, new() { return AsNav().ThenInclude(expression); } public InsertNavTask ThenInclude(Expression> expression,InsertNavOptions options) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); Func> func = () => PreFunc().ThenInclude(expression,options); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask ThenInclude(Expression>> expression, InsertNavOptions options) where TChild : class, new() { InsertNavTask result = new InsertNavTask(); Func> func = () => PreFunc().ThenInclude(expression, options); result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } public InsertNavTask Include(Expression> expression, InsertNavOptions options) where TChild : class, new() { return AsNav().ThenInclude(expression, options); } public InsertNavTask Include(Expression>> expression, InsertNavOptions options) where TChild : class, new() { return AsNav().ThenInclude(expression, options); } public Root ExecuteReturnEntity() { var hasTran = this.Context.Ado.Transaction != null; if (hasTran) { return (Root)PreFunc()?._RootList?.FirstOrDefault(); } else { Root result = null; this.Context.Ado.UseTran(() => { result= (Root)PreFunc()?._RootList?.FirstOrDefault(); }, ex => throw ex); return result; } } public async Task ExecuteReturnEntityAsync() { Root result = null; await Task.Run(async () => { result=ExecuteReturnEntity(); await Task.Delay(0); }); return result; } 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 InsertNavTask AsNav() { InsertNavTask result = new InsertNavTask(); Func> func = () => { var navas= PreFunc().AsNav(); navas.NavContext = this.NavContext; navas.IsNav = true; return navas; }; result.PreFunc = func; result.Context = this.Context; result.NavContext = this.NavContext; return result; } } }