Skip to content

Query: incorrect sql generated for query with owned entities, left join and predicate using inner qsre #8492

Closed
@maumar

Description

@maumar

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]

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions