Search code examples
c#linq-to-sqlc#-3.0linq-to-objects

Left outer join , Object reference not set to an instance of an object


I am trying to perform left outer join on 2 objects and getting an error : Object reference not set to an instance of an object.

The objects look like that

  var deliverables = OCHART.GetACAPValues(organization, ReportingPeriod, FiscalYear, "(09-10.10a) Outreach Significant").ToList();
  var references = (from rf in OCHART.References where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2") select rf).ToList();

In which deliverables might often return 0 records. Unfortunately I cannot just go and join two tables from database so deliverables must be an object.

Can somebody please point me in the right direction

Thanks,

My code is

 var items = (from rf in references
              join pt in deliverables on rf.Description equals pt.b into prt
              from x in prt.Where(prt2 => prt2.a.Equals(audience)).DefaultIfEmpty()
              where rf.RefType.Equals("09-10.10a") && rf.Comments.Equals("2")
              select new 
              {
                    audience = (string)(audience == null ? "" : audience),
                    RefType = (string)(rf.RefType == null ? "" : rf.RefType),
                    RefOrder = (int)(rf.RefOrder == null ? 0 : rf.RefOrder),
                    refName = (string)(rf.Description == null ? "" : rf.Description),
                    column_attr = (string)(x.b == null ? string.Empty : x.b),
                    value = (int)(x.ACAP == null ? (int?)null : x.ACAP)
               })
               .OrderBy(o => o.RefOrder)
               .Take(9)
               .ToList();

EDIT

After some more debugging it appears that I get error on following lines in my code

column_attr = (string)(x.b == null ? string.Empty : x.b),
value = (int)(x.ACAP == null ? (int?)null : x.ACAP)

I noticed even when I have values (added for testing) in deliverables and when values are matching the query will execute properly, but when there is no match in deliverable that's when I get the error message.

The issue is probably with handling the null values.


Solution

  • I think x is null and is causing a NullReferenceException in the following lines:

    column_attr = (string)(x.b == null ? string.Empty : x.b),
    value = (int)(x.ACAP == null ? (int?)null : x.ACAP)
    

    This judgment is based on the from x in line's DefaultIfEmpty() call, typical of left-outer-joins.

    In database code, you would write something like x.ACAP == null to detect the case where there was no matching join element. If you change this replace the 'x.property == null' checks with "x == null" checks, I suspect your problem will clear up.

    There's still the problem with the second line - you're going to get an exception at run-time if you try to cast the value (int?)null to an integer. Using a meaningful default int value such as 0 in the case that x == null will clear that up.