- 优化 Limit + Sum/Avg/Max/Min 为嵌套查询;

This commit is contained in:
2881099
2022-05-25 01:14:27 +08:00
parent 3b961681dc
commit 27cb11e4a7
5 changed files with 199 additions and 149 deletions

View File

@@ -1362,9 +1362,15 @@ namespace FreeSql.Internal
var exp3Args0 = (exp3.Arguments.FirstOrDefault() as UnaryExpression)?.Operand as LambdaExpression;
if (exp3Args0.Parameters.Count == 1 && exp3Args0.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`"))
exp3Args0 = new ReplaceHzyTupleToMultiParam().Modify(exp3Args0, fsqltables);
var sqlSum = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3Args0, tscClone1)})" })?.ToString();
var sqlSumField = $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3Args0, tscClone1)})";
var sqlSum = tscClone1.subSelect001._limit <= 0 && tscClone1.subSelect001._skip <= 0 ?
fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3Args0, tscClone1)})" })?.ToString() :
tscClone1.subSelect001.GetNestSelectSql(exp3Args0, sqlSumField, tosqlField =>
fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { tosqlField })?.ToString());
if (string.IsNullOrEmpty(sqlSum) == false)
return _common.IsNull($"({sqlSum.Replace(" \r\n", " \r\n ")})", 0);
return tscClone1.subSelect001._limit <= 0 && tscClone1.subSelect001._skip <= 0 ?
_common.IsNull($"({sqlSum.Replace(" \r\n", " \r\n ")})", 0) :
_common.IsNull($"({sqlSum})", 0);
break;
case "ToList":
case "ToOne":