diff --git a/src/EFCore.Specification.Tests/Query/AsyncGroupByQueryTestBase.cs b/src/EFCore.Specification.Tests/Query/AsyncGroupByQueryTestBase.cs index 76d89a0c8ef..44f028baae8 100644 --- a/src/EFCore.Specification.Tests/Query/AsyncGroupByQueryTestBase.cs +++ b/src/EFCore.Specification.Tests/Query/AsyncGroupByQueryTestBase.cs @@ -1093,7 +1093,7 @@ public virtual async Task GroupBy_filter_count_OrderBy_count_Select_sum() .Select(g => new { g.Key, Count = g.Count(), Sum = g.Sum(o => o.OrderID) })); } - [ConditionalFact(Skip = "Issue#10012")] + [ConditionalFact] public virtual async Task GroupBy_Aggregate_Join() { await AssertQuery( @@ -1103,7 +1103,8 @@ public virtual async Task GroupBy_Aggregate_Join() .Select(g => new { CustomerID = g.Key, LastOrderID = g.Max(o => o.OrderID) }) join c in cs on a.CustomerID equals c.CustomerID join o in os on a.LastOrderID equals o.OrderID - select new { c, o }); + select new { c, o }, + entryCount: 126); } [ConditionalFact] diff --git a/src/EFCore.Specification.Tests/Query/GroupByQueryTestBase.cs b/src/EFCore.Specification.Tests/Query/GroupByQueryTestBase.cs index 3b63e2a1a55..ad6d6327371 100644 --- a/src/EFCore.Specification.Tests/Query/GroupByQueryTestBase.cs +++ b/src/EFCore.Specification.Tests/Query/GroupByQueryTestBase.cs @@ -1096,7 +1096,7 @@ public virtual void GroupBy_filter_count_OrderBy_count_Select_sum() .Select(g => new { g.Key, Count = g.Count(), Sum = g.Sum(o => o.OrderID) })); } - [ConditionalFact(Skip = "Issue#10012")] + [ConditionalFact] public virtual void GroupBy_Aggregate_Join() { AssertQuery( @@ -1106,7 +1106,8 @@ public virtual void GroupBy_Aggregate_Join() .Select(g => new { CustomerID = g.Key, LastOrderID = g.Max(o => o.OrderID) }) join c in cs on a.CustomerID equals c.CustomerID join o in os on a.LastOrderID equals o.OrderID - select new { c, o }); + select new { c, o }, + entryCount: 126); } [ConditionalFact] diff --git a/src/EFCore/Query/ExpressionVisitors/Internal/RequiresMaterializationExpressionVisitor.cs b/src/EFCore/Query/ExpressionVisitors/Internal/RequiresMaterializationExpressionVisitor.cs index 88aaab26ff5..c6a164f8eef 100644 --- a/src/EFCore/Query/ExpressionVisitors/Internal/RequiresMaterializationExpressionVisitor.cs +++ b/src/EFCore/Query/ExpressionVisitors/Internal/RequiresMaterializationExpressionVisitor.cs @@ -245,10 +245,10 @@ private Expression VisitBinaryOperand(Expression operand, ExpressionType compari /// protected override Expression VisitSubQuery(SubQueryExpression expression) { - _queryModelStack.Push(expression.QueryModel); - if (!IsGroupByAggregateSubQuery(expression.QueryModel)) { + _queryModelStack.Push(expression.QueryModel); + expression.QueryModel.TransformExpressions(Visit); _queryModelStack.Pop(); @@ -277,13 +277,15 @@ protected override Expression VisitSubQuery(SubQueryExpression expression) return expression; } - private static bool IsGroupByAggregateSubQuery(QueryModel queryModel) + private bool IsGroupByAggregateSubQuery(QueryModel queryModel) { if (queryModel.MainFromClause.FromExpression.Type.IsGrouping() && queryModel.BodyClauses.Count == 0 && queryModel.ResultOperators.Count == 1 && !(queryModel.SelectClause.Selector is ConstantExpression) - && _aggregateResultOperators.Contains(queryModel.ResultOperators[0].GetType())) + && _aggregateResultOperators.Contains(queryModel.ResultOperators[0].GetType()) + && _queryModelStack.Count == 1 + && !_queryModelStack.Peek().BodyClauses.OfType().Any()) { return true; } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GroupByQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GroupByQuerySqlServerTest.cs index eb983e23532..39020067804 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GroupByQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GroupByQuerySqlServerTest.cs @@ -985,7 +985,16 @@ public override void GroupBy_Aggregate_Join() { base.GroupBy_Aggregate_Join(); - AssertSql(" "); + AssertContainsSql( + @"SELECT [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate] +FROM [Orders] AS [o0]", + // + @"SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] +FROM [Customers] AS [c]", + // + @"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] +FROM [Orders] AS [o] +ORDER BY [o].[CustomerID]"); } public override void GroupBy_with_result_selector() @@ -1437,6 +1446,9 @@ public override void Join_GroupBy_entity_ToList() private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); + private void AssertContainsSql(params string[] expected) + => Fixture.TestSqlLoggerFactory.AssertBaseline(expected, assertOrder: false); + protected override void ClearLog() => Fixture.TestSqlLoggerFactory.Clear(); }