Closed
Description
query:
from l1 in
(from l1 in l1s
join l2 in l2s on l1.Id equals l2.Level1_Optional_Id into grouping
from l2 in grouping.DefaultIfEmpty()
where l2.Name != "Foo"
select l1).Distinct()
select l1.Id
query model after nav rewrite:
from Level1 l1 in
(from Level1 l1 in DbSet<Level1>
join Level2 l2 in
from Level1 t in DbSet<Level1>
join Level2 t.OneToOne_Required_PK in DbSet<Level2>
on Property([t], "Id") equals Property([t.OneToOne_Required_PK], "Id") into t.OneToOne_Required_PK_group
from Level2 t.OneToOne_Required_PK in
(from Level2 t.OneToOne_Required_PK_groupItem in [t.OneToOne_Required_PK_group]
select [t.OneToOne_Required_PK_groupItem]).DefaultIfEmpty()
where Property([t.OneToOne_Required_PK], "Id") != null
select [t.OneToOne_Required_PK]
on (Nullable<int>)[l1].Id equals [l2]?.Level1_Optional_Id into grouping
from Level2 l2 in
(from Level2 <generated>_1 in [grouping]
select [<generated>_1]).DefaultIfEmpty()
where [l2]?.Name != "Foo"
select [l1]).Distinct()
select (int)[l1]?.Id
generated sql:
SELECT [t1].[Id], [t1].[OneToOne_Required_PK_Date], [t1].[OneToOne_Required_PK_Level1_Optional_Id], [t1].[OneToOne_Required_PK_Level1_Required_Id], [t1].[OneToOne_Required_PK_Name], [t1].[OneToOne_Required_PK_OneToOne_Optional_PK_InverseId], [t1].[Id]
FROM (
SELECT DISTINCT [t0].[Id], [t0].[OneToOne_Required_PK_Date], [t0].[OneToOne_Required_PK_Level1_Optional_Id], [t0].[OneToOne_Required_PK_Level1_Required_Id], [t0].[OneToOne_Required_PK_Name], [t0].[OneToOne_Required_PK_OneToOne_Optional_PK_InverseId]
FROM [Level1] AS [l1]
LEFT JOIN (
SELECT [t].[Id], [t].[OneToOne_Required_PK_Date], [t].[OneToOne_Required_PK_Level1_Optional_Id], [t].[OneToOne_Required_PK_Level1_Required_Id], [t].[OneToOne_Required_PK_Name], [t].[OneToOne_Required_PK_OneToOne_Optional_PK_InverseId]
FROM [Level1] AS [t]
WHERE [t].[Id] IS NOT NULL
) AS [t0] ON [l1].[Id] = [t0].[OneToOne_Required_PK_Level1_Optional_Id]
WHERE ([t0].[OneToOne_Required_PK_Name] <> N'Foo') OR [t0].[OneToOne_Required_PK_Name] IS NULL
) AS [t1]
note that projected columns come from the joined entity (l2), instead of expected l1.
If the predicate is removed, or changed so that l1.Name is being used, everything works fine:
SELECT [t1].[Id]
FROM (
SELECT DISTINCT [l1].*
FROM [Level1] AS [l1]
LEFT JOIN (
SELECT [t].*
FROM [Level1] AS [t]
WHERE [t].[Id] IS NOT NULL
) AS [t0] ON [l1].[Id] = [t0].[OneToOne_Required_PK_Level1_Optional_Id]
WHERE ([l1].[Name] <> N'Foo') OR [l1].[Name] IS NULL
) AS [t1]