当测试 returns NullReferenceException 类型时,如何在 Epicor BPM 中测试 null var?

How do you test a null var in Epicor BPM when the act of testing returns a NullReferenceException type?

我有一个 Epicor BPM,我在其中尝试测试订单(IE 临时 table ttOrderHed 中的条目)是否有任何行(IE 数据库中的条目 table Db.OrderDtl).

当我使用已知有线的订单进行测试时,这有效;当我使用一个没有的订单时,它 returns 一个 NullReferenceException:


var oh = (from o in ttOrderHed
          select o).FirstOrDefault();

var od = (from d in Db.OrderDtl
           where d.Company == oh.Company &&
                 d.OrderNum == oh.OrderNum
           select d).FirstOrDefault();

if ( od != null)
    {
      //do some Things and Stuff
    }

我想也许我正在测试一些无效的东西,因此退出了。我试图像这样绕过它:

if (!(od == null)
     {
       //do stuff
     }

并得到了同样的异常。

我在整个过程中都有调试变量,我可以肯定地说,任何尝试用 var od 做任何事情都会让我退出经线。例如,如果我尝试将它的值分配给已在别处声明的调试变量 b1 = od.OrderNum.ToString();,我也会在此处收到 NullReferenceException,就在早些时候。

我整晚都在研究这个,并在这里阅读了这篇非常好的概述:

What is a NullReferenceException, and how do I fix it?

到目前为止我画的是一片空白。我想部分问题是我在 Epicor 的内置 IDE 中工作,它有一个非常有限的语法检查器(它说我很高兴)和一个 ersatz "Intellisense" 工具,但除此之外不提供任何反馈或错误消息。当然,我可以将输出发送到服务器的事件查看器,但我得到的只是 NullReferenceException 本身。

如有任何反馈或建议,我们将不胜感激。非常感谢。

编辑:如果它对任何人有帮助,这里是最终有效的代码。我还有很多事情要做,但这个已经解决了。

    if (ttOrderHed.Any())
      {
      var oh = (from o in ttOrderHed select o).FirstOrDefault();

      if  ((from d in Db.OrderDtl where d.OrderNum == oh.OrderNum select d).Any())
           {
             var od = (from d in Db.OrderDtl
                        where   d.OrderNum == oh.OrderNum
                        select  d).FirstOrDefault();

             var tmp = od.OrderNum;

             // do stuff

           } // end if OrderDtl

      } // end if ttOrderHed

看来你对linq和设计模式是个新手。在查询集合之前 检查集合是否为空通常是一个更好的主意。考虑到这一点,以下应该有效:

if (ttOrderHed == null || !ttOrderHed.Any()) { //Handle no value }

if (Db?.OrderDtl == null || !Db.OrderDtl.Any()) { //Handle no value }

var oh = ttOrderHed.First(); //Guaranteed to have a value

var ods = (
    from d in Db.OrderDtl
    where d.Company == oh.Company
        && d.OrderNum == oh.OrderNum
    select d).ToList();

if (!ods.Any()) { //Handle no value }

var od = ods[0];