Skip to content

Query :: optional navigations null-ref protection logic doesn't work for some cases involving multiple optional navs and method calls #5613

@maumar

Description

@maumar

Found during investigation of #5481

model:

    public class Shipment
    {
        public int Id { get; set; }
        public string CarrierName { get; set; }
        public int? CargoReportId { get; set; }
        public Report CargoReport { get; set; }
        public int? AltCargoReportId { get; set; }
        public Report AltCargoReport { get; set; }
    }

    public class Report
    {
        public int Id { get; set; }
        public string Reference { get; set; }
    }

    public class MyContext : DbContext
    {
        public DbSet<Shipment> Shipments { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=.;Database=Repro5613;Trusted_Connection=True;MultipleActiveResultSets=true;");
        }
    }

query:

                var query = ctx.Shipments
                     .Where(s => s.CargoReport.Reference.Contains("whatever")
                             || s.AltCargoReport.Reference.Contains("whatever"));

relevant query plan fragment:

(t3.Outer.Outer.Inner != null ? t3.Outer.Outer.Inner.Reference : null).Contains(
            value: whatever
        )

this will null ref if Outer.Outer.Inner is null

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions