dotnet / dotnet/efcore

Query: we don't convert JOIN to APPLY for query with subquery inside argument to Take method

Open
#32,303 3 comments 1 reaction 0 assignees View on GitHub
area-query consider-for-next-release
Dominant language
C#
Stars
14.8k
Forks
3.4k
PR merge metrics
PR metrics pending

Description

query:

```c#
ss.Set().OrderBy(x => x.Name).Select(x => x.BornGears.OrderBy(g => g.FullName).Take(x.StationedGears.Any() ? 1 : 2))
```

sql:

```sql
SELECT [c].[Name], [t0].[Nickname], [t0].[SquadId], [t0].[AssignedCityName], [t0].[CityOfBirthName], [t0].[Discriminator], [t0].[FullName], [t0].[HasSoulPatch], [t0].[LeaderNickname], [t0].[LeaderSquadId], [t0].[Rank]
FROM [Cities] AS [c]
LEFT JOIN (
SELECT [t].[Nickname], [t].[SquadId], [t].[AssignedCityName], [t].[CityOfBirthName], [t].[Discriminator], [t].[FullName], [t].[HasSoulPatch], [t].[LeaderNickname], [t].[LeaderSquadId], [t].[Rank]
FROM (
SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], ROW_NUMBER() OVER(PARTITION BY [g].[CityOfBirthName] ORDER BY [g].[FullName]) AS [row]
FROM [Gears] AS [g]
) AS [t]
WHERE [t].[row] <= CASE
WHEN EXISTS (
SELECT 1
FROM [Gears] AS [g0]
WHERE [c].[Name] = [g0].[AssignedCityName]) THEN 1
ELSE 2
END
) AS [t0] ON [c].[Name] = [t0].[CityOfBirthName]
ORDER BY [c].[Name], [t0].[CityOfBirthName], [t0].[FullName], [t0].[Nickname]
```

error:

SqlException : The multi-part identifier "c.Name" could not be bound.

note that converting to outer apply works just fine

```sql
SELECT [c].[Name], [t0].[Nickname], [t0].[SquadId], [t0].[AssignedCityName], [t0].[CityOfBirthName], [t0].[Discriminator], [t0].[FullName], [t0].[HasSoulPatch], [t0].[LeaderNickname], [t0].[LeaderSquadId], [t0].[Rank]
FROM [Cities] AS [c]
OUTER APPLY (
SELECT [t].[Nickname], [t].[SquadId], [t].[AssignedCityName], [t].[CityOfBirthName], [t].[Discriminator], [t].[FullName], [t].[HasSoulPatch], [t].[LeaderNickname], [t].[LeaderSquadId], [t].[Rank]
FROM (
SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank], ROW_NUMBER() OVER(PARTITION BY [g].[CityOfBirthName] ORDER BY [g].[FullName]) AS [row]
FROM [Gears] AS [g]
) AS [t]
WHERE [c].[Name] = [t].[CityOfBirthName] AND [t].[row] <= CASE
WHEN EXISTS (
SELECT 1
FROM [Gears] AS [g0]
WHERE [c].[Name] = [g0].[AssignedCityName]) THEN 1
ELSE 2
END
) AS [t0]
ORDER BY [c].[Name], [t0].[CityOfBirthName], [t0].[FullName], [t0].[Nickname]
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.