Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 907f202

Browse files
committed
Visit inside InlineQueryRootExpression in nav expansion
Fixes #32331
1 parent caaf394 commit 907f202

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,23 @@ protected override Expression VisitExtension(Expression extensionExpression)
249249

250250
return ApplyQueryFilter(entityType, navigationExpansionExpression);
251251

252+
// Inline query roots can contain arbitrary expressions, including subqueries with navigations; visit inside to process those.
253+
case InlineQueryRootExpression inlineQueryRootExpression:
254+
{
255+
var visited = inlineQueryRootExpression.Update(this.VisitAndConvert(inlineQueryRootExpression.Values));
256+
var currentTree = new NavigationTreeExpression(Expression.Default(inlineQueryRootExpression.ElementType));
257+
var parameterName = GetParameterName("e");
258+
259+
return new NavigationExpansionExpression(visited, currentTree, currentTree, parameterName);
260+
}
261+
252262
case QueryRootExpression queryRootExpression:
263+
{
253264
var currentTree = new NavigationTreeExpression(Expression.Default(queryRootExpression.ElementType));
254265
var parameterName = GetParameterName("e");
255266

256267
return new NavigationExpansionExpression(queryRootExpression, currentTree, currentTree, parameterName);
268+
}
257269

258270
case NavigationExpansionExpression:
259271
case OwnedNavigationReference:

test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4606,6 +4606,14 @@ await AssertTranslationFailed(
46064606
AssertSql();
46074607
}
46084608

4609+
public override async Task Subquery_with_navigation_inside_inline_collection(bool async)
4610+
{
4611+
await AssertTranslationFailed(
4612+
() => base.Subquery_with_navigation_inside_inline_collection(async));
4613+
4614+
AssertSql();
4615+
}
4616+
46094617
private void AssertSql(params string[] expected)
46104618
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
46114619

test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5652,4 +5652,12 @@ public virtual Task Collection_navigation_equal_to_null_for_subquery_using_Eleme
56525652
ss => ss.Set<Customer>().Where(c => c.Orders.OrderBy(o => o.OrderID).ElementAtOrDefault(prm).OrderDetails == null),
56535653
ss => ss.Set<Customer>().Where(c => c.Orders.OrderBy(o => o.OrderID).ElementAtOrDefault(prm) == null));
56545654
}
5655+
5656+
[ConditionalTheory]
5657+
[MemberData(nameof(IsAsyncData))]
5658+
public virtual Task Subquery_with_navigation_inside_inline_collection(bool async)
5659+
=> AssertQuery(
5660+
async,
5661+
ss => ss.Set<Customer>().Where(c => new[] { 10251, c.Orders.Max(o => o.OrderID) }.Max() > 10251),
5662+
ss => ss.Set<Customer>().Where(c => c.Orders.Any() && new[] { 10251, c.Orders.Max(o => o.OrderID) }.Max() > 10251));
56555663
}

test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7260,6 +7260,21 @@ ORDER BY [o].[OrderID]
72607260
""");
72617261
}
72627262

7263+
public override async Task Subquery_with_navigation_inside_inline_collection(bool async)
7264+
{
7265+
await base.Subquery_with_navigation_inside_inline_collection(async);
7266+
7267+
AssertSql(
7268+
"""
7269+
SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]
7270+
FROM [Customers] AS [c]
7271+
WHERE GREATEST(10251, (
7272+
SELECT MAX([o].[OrderID])
7273+
FROM [Orders] AS [o]
7274+
WHERE [c].[CustomerID] = [o].[CustomerID])) > 10251
7275+
""");
7276+
}
7277+
72637278
private void AssertSql(params string[] expected)
72647279
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
72657280

0 commit comments

Comments
 (0)