- 优化 WithTempQuery + ToList 使用子查询;

This commit is contained in:
2881099
2023-03-02 19:48:34 +08:00
parent df3073819d
commit a7c3783e8a
6 changed files with 38 additions and 5 deletions

View File

@ -955,12 +955,12 @@ namespace FreeSql.Internal
return $"not({ExpressionLambdaToSql(notExp, tsc)})";
case ExpressionType.Quote: return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc);
case ExpressionType.Lambda: return ExpressionLambdaToSql((exp as LambdaExpression)?.Body, tsc);
//case ExpressionType.Invoke: return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams);
case ExpressionType.Invoke:
case ExpressionType.Invoke: //#1378
var invokeExp = exp as InvocationExpression;
var invokeReplaceVistor = new FreeSql.Internal.CommonExpression.ReplaceVisitor();
var invokeReplaceExp = invokeExp.Expression;
var invokeLambdaExp = invokeReplaceExp as LambdaExpression;
var invokeLambdaExp = invokeReplaceExp as LambdaExpression;
if (invokeLambdaExp == null) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType, tsc.mapColumnTmp, tsc.dbParams);
var invokeReplaceVistor = new FreeSql.Internal.CommonExpression.ReplaceVisitor();
var len = Math.Min(invokeExp.Arguments.Count, invokeLambdaExp.Parameters.Count);
for (var a = 0; a < len; a++)
invokeReplaceExp = invokeReplaceVistor.Modify(invokeReplaceExp, invokeLambdaExp.Parameters[a], invokeExp.Arguments[a]);

View File

@ -493,6 +493,12 @@ namespace FreeSql.Internal.CommonProvider
var tb = _select._tables.Find(a => a.Parameter == firstExp)?.Table;
if (tb == null) return base.VisitMember(node);
if (tb.Columns.Any() == false && _select._diymemexpWithTempQuery != null) //匿名类,嵌套查询 DTO
{
Result.Add(NativeTuple.Create(node, default(ColumnInfo)));
return node;
}
while (exps.Any())
{
var memExp = exps.Pop() as MemberExpression;