From ac7df08ad55d8361bbd6fb3c001310cb3c25aa24 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 13 Jul 2022 16:59:25 +0800 Subject: [PATCH] Update exp to sql --- .../ExecuteNavProvider/DeleteNavManyToMany.cs | 2 +- .../ExecuteNavProvider/DeleteNavOneToMany.cs | 18 +++++- .../ExecuteNavProvider/DeleteNavProvider.cs | 62 ++++++++++++++++++- .../QueryableProvider/NavigatManager.cs | 2 +- .../ExpressionsToSql/Common/ExpressionTool.cs | 13 ++++ 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs index 96b86ff56..23358c0b9 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs @@ -39,7 +39,7 @@ namespace SqlSugar .Rows.Cast().Select(it => it[0]).ToList(); - var childList = this._Context.Queryable().In(thisPkColumn.DbColumnName, bids).ToList(); + var childList = GetChildList().In(thisPkColumn.DbColumnName, bids).ToList(); if (IsDeleteB()) diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs index d1b33208d..45a37af84 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs @@ -28,8 +28,8 @@ namespace SqlSugar SetContext(() => this._Context.Deleteable(prentList).ExecuteCommand()); var ids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList(); - var childList = this._Context.Queryable().In(thisFkColumn.DbColumnName, ids).ToList(); - + var childList = GetChildList().In(thisFkColumn.DbColumnName, ids).ToList(); + this._ParentList = childList.Cast().ToList(); this._ParentPkColumn = thisPkColumn; this._IsDeletedParant = true; @@ -37,6 +37,20 @@ namespace SqlSugar SetContext(() => this._Context.Deleteable(childList).ExecuteCommand()); } + private ISugarQueryable GetChildList() where TChild : class, new() + { + var queryable = this._Context.Queryable(); + if (_WhereList.HasValue()) + { + foreach (var item in _WhereList) + { + queryable.Where(item); + } + queryable.AddParameters(_Parameters); + } + return queryable; + } + private void SetContext(Action action) { var key = "_DeleteNavTask"; diff --git a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs index d7edca7f0..ac88473fc 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs @@ -17,11 +17,13 @@ namespace SqlSugar public EntityColumnInfo _ParentPkColumn { get; set; } public SqlSugarProvider _Context { get; set; } public bool _IsDeletedParant { get; set; } - + public List _WhereList = new List(); + public List _Parameters = new List(); public DeleteNavProvider ThenInclude< TChild>(Expression> expression) where TChild : class, new() { InitParentList(); + Expression newExp = GetMamber(expression); var name = ExpressionTool.GetMemberName(expression); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); if (nav.Navigat == null) @@ -47,7 +49,8 @@ namespace SqlSugar where TChild : class, new() { InitParentList(); - var name = ExpressionTool.GetMemberName(expression); + Expression newExp = GetMamber(expression); + var name = ExpressionTool.GetMemberName(newExp); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); if (nav.Navigat == null) { @@ -67,6 +70,61 @@ namespace SqlSugar } return GetResult(); } + + private Expression GetMamber(Expression expression) + { + int i = 0; + Expression newExp =ExpressionTool.GetLambdaExpressionBody(expression); + while (newExp is MethodCallExpression) + { + var callMethod = (newExp as MethodCallExpression); + ActionMethodCallExpression(callMethod); + newExp = callMethod.Arguments[0]; + i++; + Check.Exception(i > 10000, expression + " is error"); + } + return newExp; + } + + + private void ActionMethodCallExpression(MethodCallExpression method) + { + var queryBuilder = GetQueryBuilder(); + NavigatManager navigatManager = new NavigatManager() + { + Context = this._Context + }; + if (method.Method.Name == "ToList") + { + + } + else if (method.Method.Name == "Where") + { + navigatManager.CheckHasRootShortName(method.Arguments[0], method.Arguments[1]); + var exp = method.Arguments[1]; + _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); + } + else if (method.Method.Name == "WhereIF") + { + var isOk = LambdaExpression.Lambda(method.Arguments[1]).Compile().DynamicInvoke(); + if (isOk.ObjToBool()) + { + var exp = method.Arguments[2]; + navigatManager.CheckHasRootShortName(method.Arguments[1], method.Arguments[2]); + _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); + } + } + if (queryBuilder.Parameters != null) + { + _Parameters.AddRange(queryBuilder.Parameters); + } + } + + private QueryBuilder GetQueryBuilder() + { + return this._Context.Queryable().QueryBuilder; + } + private DeleteNavProvider GetResult() where TChild : class, new() { return new DeleteNavProvider() diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index e74d9fdb5..ff4d4e4e3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -649,7 +649,7 @@ namespace SqlSugar result.SelectString = result.SelectString + "," + selectPkName; } } - private void CheckHasRootShortName(Expression rootExpression, Expression childExpression) + public void CheckHasRootShortName(Expression rootExpression, Expression childExpression) { var rootShortName = GetShortName(rootExpression); if (rootShortName.HasValue()&& childExpression.ToString().Contains($" {rootShortName}.")) diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index fc59a7782..8d24ab674 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -91,6 +91,19 @@ namespace SqlSugar else return value; } + + public static Expression GetLambdaExpressionBody(Expression expression) + { + Expression newExp = expression; + if (newExp is LambdaExpression) + { + newExp = (newExp as LambdaExpression).Body; + } + + return newExp; + } + + public static Type GetMemberInfoType(MemberInfo member) { switch (member.MemberType)