左外连接,对象引用未设置为对象的实例

时间:2012-08-24 19:16:22

标签: 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.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)

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

问题可能在于处理空值。

3 个答案:

答案 0 :(得分:4)

我认为x为空,并在以下行中导致NullReferenceException

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

此判断基于from x in行的DefaultIfEmpty()调用,典型的左外连接。

在数据库代码中,您可以编写类似x.ACAP == null的内容来检测没有匹配的连接元素的情况。如果你改变这个替换'x.property == null'检查用“x == null”检查,我怀疑你的问题将被清除。

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

答案 1 :(得分:1)

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

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

在您发表评论后添加:

请注意,当您的变量为null时,最好不要使用.Equals()。请改用==。参考:http://www.dotnetperls.com/string-equals

还可以设想(x.ACAP == null ? (int?)null : x.ACAP)返回null。 你把整个东西作为一个int:value = (int)(x.ACAP == null ? (int?)null : x.ACAP)。将null转换为n int显然会失败

答案 2 :(得分:0)

只是为了记录,C#6.0中新的Null条件运算符可以像这样使用:

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