小数点?左外部联接的LINQ中获取空引用

时间:2018-09-18 12:42:32

标签: linq asp.net-core-2.1 ef-core-2.1

我试图在LINQ中进行两个var的左外部联接,但是在选择所需的列时,在需要Object reference not set to an instance of an object的地方出现Nullable decimal错误。

    var FLS = (from ee in SumTillFYEnd 
                        join es in SumTillFYStart on ee.Account equals es.Account into temp
                        from t in temp.DefaultIfEmpty()                             
                        select new
                        {  
                            Account = ee.Account, // As of here it works
                            BeginDr = (t.DrStartCF == 0) ? (decimal?) null : t.DrStartCF // Here I get error Object reference not set to an instance of an object.
                        });

有时SumTillFYEnd和某些时候SumTillFYStart变为空。我想加入应该使用默认值,以防任何一个或两个都为空。

2 个答案:

答案 0 :(得分:0)

问题是试图将null强制转换为decimal?。您永远无法直接将null强制转换为其他类型,无论是否可以为null。这将始终导致NullReferenceException。相反,您想要的是default。换句话说,替换为:

(decimal?)null

使用

default(decimal?)

答案 1 :(得分:0)

我使用默认类解决了这个问题。

我看到的原因是十进制不能为null,因此需要将其设置为self._target(*self._args, **self._kwargs) TypeError: fn() got multiple values for argument 'a' Process Process-3: 0的默认值

因此,您需要为decimal.MinValue使用默认类,如

SumTillFYStart

在上下文中使用上面的内容,然后在您的代码段中替换

var defaultSumTillFYStart = new SumTillFYStart { Account = string.Empty, DrStartCF =0};

与此

from t in temp.DefaultIfEmpty()

我在下面写了一个linqPad作品,但用于不同的子集;我认为这会对某人有所帮助:

from t in temp.DefaultIfEmpty(defaultSumTillFYStart)

在这里输出:

enter image description here