C# 左外部联接,对象引用未设置为对象的实例

C# 左外部联接,对象引用未设置为对象的实例,c#,linq-to-sql,c#-3.0,linq-to-objects,C#,Linq To Sql,C# 3.0,Linq To Objects,我试图在2个对象上执行左外连接,但出现错误:对象引用未设置为对象的实例。 这些物体看起来像那样 var deliverables = OCHART.GetACAPValues(organization, ReportingPeriod, FiscalYear, "(09-10.10a) Outreach Significant").ToList(); var references = (from rf in OCHART.References where rf.RefType.Equal

我试图在2个对象上执行左外连接,但出现错误:对象引用未设置为对象的实例。

这些物体看起来像那样

  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();
其中,可交付成果通常可能返回0条记录。不幸的是,我不能直接从数据库连接两个表,所以可交付成果必须是一个对象

谁能给我指一下正确的方向吗

谢谢

我的代码是

 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),
                    collumn_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();
编辑: 在进一步调试之后,我的代码中的以下行似乎出现了错误

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

我注意到,即使在可交付成果中有值(添加用于测试),并且当值匹配时,查询也会正确执行,但当可交付成果中没有匹配时,我就会收到错误消息


问题可能在于处理空值。

如果您在执行查询之前单步执行代码,您是否确实看到“可交付成果”和“引用”中填充了数据

调查查询中使用的所有子表/属性。出现该错误的原因很可能是因为比较时使用的属性之一为null。 .RefType.Comment,例如。 可能.RefType为null,并且在最后排序时遇到问题。很难说没有看到这两个系列中的内容

在您的评论之后添加:

请注意,当变量可能为null时,最好不要使用.Equals()。使用==代替。参考:

还可以想象
(x.ACAP==null?(int?.null:x.ACAP)
返回一个
null

您正在将整个事件转换为int:
value=(int)(x.ACAP==null?(int?)null:x.ACAP)
。将
null
强制转换为n
int
显然会失败

我认为
x
为null,并导致以下行出现
null引用异常

collumn_attr = (string)(x.b == null ? string.Empty : x.b),
value = (int)(x.ACAP == null ? (int?)null : x.ACAP)
此判断基于行的
DefaultIfEmpty()
调用中的
from x,这是典型的左外连接

在数据库代码中,您可以编写类似于
x.ACAP==null
的代码来检测没有匹配联接元素的情况。如果您更改此选项,将“x.property==null”检查替换为“x==null”检查,我怀疑您的问题将得到解决


第二行仍然存在问题-如果尝试将值
(int?)null
强制转换为整数,则在运行时会出现异常。在
x==null
的情况下,使用有意义的默认值
int
如0将清除该值。

仅用于记录,C#6.0中的新null条件运算符可以如下使用:

                collumn_attr = x?.b ?? string.Empty,
                value = x?.ACAP

引用总是被填充的,但是可交付成果列表有可能是0,并且是空的,没有任何记录,当我调试代码时,我得到的错误在collumn_attr=(string)(x.b==null?string.empty:x.b)行,并且在value=(int)(x.ACAP==null?(int?)null:x.ACAP)行,即使我有值(添加用于测试),我也注意到了在可交付成果中,当值匹配时,查询将正确执行,但当不匹配时,我会收到错误消息。问题可能是处理空值。我尝试了你的建议,你发现了,我做了value=(int)(x==null?0:x.ACAP),现在一切都正常工作了。非常感谢你的帮助。谢谢