我收到了生产系统错误的报告。我无法轻松访问生产系统。我将在适当的时候获得我需要的所有数据,但我正在尝试做的是加快解决此问题的过程。我试图消除尽可能多的猜测。
错误我得到了这个:
扩展属性:异常 - System.InvalidOperationException:The 转换为值类型'Decimal'失败 因为物化价值是 空值。结果类型的通用 参数或查询必须使用a 可空类型。
发生错误的代码是:
IQueryable<AccountStatusModel> result = from d in Context.Debtors
where // Condition here
select new AccountStatusModel
{
// All of the below are decimal in the AccountStatusModel
// and all of them are decimal NOT NULL in the database
NotYetDue = d.sometable.dbcurrent,
DueThisMonth = d.sometable.dbprd1bal,
Overdue = d.sometable.dbprd2bal
+ d.sometable.dbprd3bal
+ d.sometable.dbprd4bal
+ d.sometable.dbprd5bal
+ d.sometable.dbprd6bal,
PaymentRecievedNotAllocated = d.sometable.dbunalloc,
OutstandingOrders = d.dmoutordval ?? 0,
TotalBalance = d.sometable.dbcurrent
+ d.sometable.dbprd1bal
+ d.sometable.dbprd2bal
+ d.sometable.dbprd3bal
+ d.sometable.dbprd4bal
+ d.sometable.dbprd5bal
+ d.sometable.dbprd6bal
+ d.sometable.dbunalloc
+ (d.dmoutordval ?? 0),
CreditLimit = d.dmcredlim,
LastPayment = d.dmvallastpaid,
// Some other properties here
// ....
};
在有人评论字段名称之前,假设这些是假名。 =) 请注意,要查询的所有数据库字段都不是NULL。
我无法在开发环境中重现此错误。
我认为,这个错误在PROD中发生的原因是因为不知何故,在被查询的字段中,一个被标记为NULL。我没有快速检查这个,但我最终会。
我现在的问题是:这个错误还有其他原因吗?如果查询如上所述,是否可能出现此错误,并且字段确实是非NULL。 (为什么?)如果有可能请提供一个例子。
请回答,如果你肯定你是对的,即我需要更强的东西,而不是“我认为就是这样”。
答案 0 :(得分:1)
正如我在对GregC的回答中所怀疑的那样,问题在于加入。架构证明是正确的。但是,如果“sometable”没有相关“Debtors”记录的记录,那么我引用的查询可以返回空值。我这个案例d.sometable.Anything将为null。因为L2E合并了NULLS,所以它不会抱怨d.sometable为null,而只是为d.sometable.Anything返回null。
所以这是怎么回事。
答案 1 :(得分:0)
您的查询看起来不错。这里的关键是“物化”这个词,这意味着当用表中的DBNull对表格单元进行保湿时会发生异常。