From aee4fd562b40e692c7ade334cc067de5f39ce2ad Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 20 May 2023 10:42:19 +0800 Subject: [PATCH] Optimized code (Subquery.Group) --- .../ExpressionsToSql/Common/ExpressionTool.cs | 24 +++++++++++++++++++ .../ResolveItems/BinaryExpressionResolve.cs | 8 +++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 1b788ff9c..f9a5f9346 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -9,6 +9,30 @@ namespace SqlSugar { public class ExpressionTool { + + public static List GetTopLevelMethodCalls(Expression expression) + { + var methodCalls = new List(); + GetTopLevelMethodCalls(expression, methodCalls); + return methodCalls; + } + + public static void GetTopLevelMethodCalls(Expression expression, List methodCalls) + { + if (expression is MethodCallExpression methodCallExpression) + { + methodCalls.Add(methodCallExpression.Method.Name); + if (methodCallExpression.Object is MethodCallExpression parentMethodCallExpression) + { + GetTopLevelMethodCalls(parentMethodCallExpression, methodCalls); + } + } + else if (expression is LambdaExpression lambdaExpression) + { + GetTopLevelMethodCalls(lambdaExpression.Body, methodCalls); + } + } + public static Dictionary GetNewExpressionItemList(Expression lamExp) { var caseExp = GetLambdaExpressionBody(lamExp); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs index dc0552eb2..a612d99de 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BinaryExpressionResolve.cs @@ -327,15 +327,15 @@ namespace SqlSugar { return false; } - var methodString = method.ToString(); - if (methodString.IndexOf("GroupBy(")<=0) + var topMethods =ExpressionTool.GetTopLevelMethodCalls(method); + if (!topMethods.Contains("Subqueryable")) { return false; } - if (Regex.Matches(methodString, @"Subqueryable\(").Count!=1) + if (!topMethods.Contains("GroupBy")) { return false; - } + } return true; } private static bool IsJoinString(BinaryExpression expression, string operatorValue)