From a2506a25c18dc9349b601fa3bf60a7c1e37e59eb Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 6 Aug 2022 16:23:08 +0800 Subject: [PATCH] Update exp to sql --- .../Subquery/Items/SubOrderBy.cs | 10 ++- .../ExpressionsToSql/Subquery/SubResolve.cs | 90 ++++++++++++------- 2 files changed, 63 insertions(+), 37 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs index f71ee7159..5b5e91ec4 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs @@ -8,6 +8,7 @@ namespace SqlSugar { public class SubOrderBy : ISubOperation { + public int OrderIndex { get; set; } = 0; public bool HasWhere { get; set; @@ -27,7 +28,7 @@ namespace SqlSugar { get { - return 480; + return 480+OrderIndex; } } @@ -44,7 +45,7 @@ namespace SqlSugar } var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; - var result = "ORDER BY " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle); + var result =(OrderIndex==0? "ORDER BY ":",") + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle); var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; @@ -52,6 +53,7 @@ namespace SqlSugar } public class SubOrderByDesc : ISubOperation { + public int OrderIndex { get; set; } = 0; public bool HasWhere { get; set; @@ -71,7 +73,7 @@ namespace SqlSugar { get { - return 480; + return 480+OrderIndex; } } @@ -84,7 +86,7 @@ namespace SqlSugar { var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; - var result = "ORDER BY " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle)+" DESC"; + var result = (OrderIndex == 0 ? "ORDER BY " : ",") + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle)+" DESC"; var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; result = result.Replace(selfParameterName, string.Empty); return result; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 429645828..a278c4206 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -168,41 +168,42 @@ namespace SqlSugar { var isSubSubQuery = this.allMethods.Select(it => it.ToString()).Any(it => Regex.Matches(it, "Subquery").Count > 1); var isubList = this.allMethods.Select(exp => - { - if (isSubSubQuery) - { - this.context.JoinIndex = 1; - this.context.SubQueryIndex = 0; - } - var methodName = exp.Method.Name; - var items = SubTools.SubItems(this.context); - var item = items.First(s => s.Name == methodName); - if (item is SubWhere && hasWhere == false) - { - hasWhere = true; - } - else if (item is SubWhere) - { - item = items.First(s => s is SubAnd); - } + { + if (isSubSubQuery) + { + this.context.JoinIndex = 1; + this.context.SubQueryIndex = 0; + } + var methodName = exp.Method.Name; + var items = SubTools.SubItems(this.context); + var item = items.First(s => s.Name == methodName); + if (item is SubWhere && hasWhere == false) + { + hasWhere = true; + } + else if (item is SubWhere) + { + item = items.First(s => s is SubAnd); + } - if (item is SubWhereIF && hasWhere == false) - { - hasWhere = true; - } - else if (item is SubWhereIF) - { - item = items.First(s => s is SubAndIF); - } - else if (item is SubSelectStringJoin) - { - isXmlPath = true; - } + if (item is SubWhereIF && hasWhere == false) + { + hasWhere = true; + } + else if (item is SubWhereIF) + { + item = items.First(s => s is SubAndIF); + } + else if (item is SubSelectStringJoin) + { + isXmlPath = true; + } - item.Context = this.context; - item.Expression = exp; - return item; - }).ToList(); + item.Context = this.context; + item.Expression = exp; + return item; + }).ToList(); + SetOrderByIndex(isubList); isubList.Insert(0, new SubBegin()); if (isubList.Any(it => it is SubSelect)) { @@ -229,5 +230,28 @@ namespace SqlSugar this.context.JoinIndex = 0; return result; } + + private static void SetOrderByIndex(List isubList) + { + var orderByIndex = 0; + var orderByList = isubList.Where(it => it is SubOrderBy || it is SubOrderByDesc).ToList(); + if (orderByList.Count > 1) + { + orderByList.Reverse(); + foreach (var item in orderByList) + { + if (item is SubOrderBy) + { + (item as SubOrderBy).OrderIndex = orderByIndex; + orderByIndex++; + } + else if (item is SubOrderByDesc) + { + (item as SubOrderByDesc).OrderIndex = orderByIndex; + orderByIndex++; + } + } + } + } } }