From 1b995d1e26cb3655ed2296383a5b68062aa9dc14 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Tue, 18 Oct 2022 20:16:16 +0200 Subject: [PATCH] UseAlias --- .../SqlExpressions/SelectExpression.Helper.cs | 23 +++++++++++++++++++ .../Query/SqlExpressions/SelectExpression.cs | 6 +++++ 2 files changed, 29 insertions(+) diff --git a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs index b1681821729..25edf3bd1f9 100644 --- a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs +++ b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.Helper.cs @@ -154,6 +154,29 @@ public ProjectionIndexRemappingExpressionVisitor( } } + private sealed class UseAliasExpressionVisitor : ExpressionVisitor + { + private readonly SelectExpression _queryExpression; + + public UseAliasExpressionVisitor(SelectExpression queryExpression) + { + _queryExpression = queryExpression; + } + + [return: NotNullIfNotNull("expression")] + public override Expression? Visit(Expression? expression) + { + foreach (var x in _queryExpression.Projection) + { + if (x.Expression.Equals(expression)) + { + return new SqlFragmentExpression(x.Alias); + } + } + return base.Visit(expression); + } + } + private sealed class SqlRemappingVisitor : ExpressionVisitor { private readonly SelectExpression _subquery; diff --git a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs index e6c7ddf1997..65e0931c8c7 100644 --- a/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs +++ b/src/EFCore.Relational/Query/SqlExpressions/SelectExpression.cs @@ -1570,6 +1570,12 @@ Expression CopyProjectionToOuter(SelectExpression innerSelectExpression, Express _projectionMapping.Clear(); _projectionMapping = result; + var useAliasVisitor = new UseAliasExpressionVisitor(this); + for (var i = 0; i < _orderings.Count; i++) + { + _orderings[i] = useAliasVisitor.VisitAndConvert(_orderings[i], nameof(ApplyProjection)); + } + return shaperExpression; }