当测试 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];
我有一个 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];