LINQ SUM 可为空

LINQ SUM Nullable

我有一个简单的 linq 查询

(From a In db.payments Group Join b In db.interestcharges On  a.pid Equals b.pid Into totalinterest = Group, TotalInterestReceived = Sum(b.interest)) select a, TotalInterestReceived).toList()

b.interest 是 DB 中的十进制类型。

投掷

"The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type."

这是因为 InterestCharges table 可能没有 pid 的任何兴趣记录。

我试过 sum(if(b.interest=nothing,0,b.interest) 但 LINQ 将其转换为 if(b.interest=0, 0, b.interest) 因此它从不检查空值。似乎没有别的工作而不是没有。我试过vbNullisDBNull(),都没有成功。当总和不为空时,查询工作正常。 defaultifempty(0) 可能有效,但不确定如何在这种情况下使用它。有什么指点吗?

GROUP JOIN 语句表明您正在尝试 LEFT OUTER JOIN。这就是您收到 NULL 问题的原因。通过将 JOIN 用于 INNER JOIN,您将不会偶然发现这一点,但这也意味着您将只会看到那些具有感兴趣值的项目。

(FROM a in db.Payments 
Join b in db.InterestCharges ON a.pid Equals b.Pid 
SELECT a, TotalInterestReceived = SUM(b.Interest) 
).toList()

可以生成子select,它可能会得到您希望的值。这里的目的是你得到所有的付款,然后基本上加上利息费用(如果有 none 则为 0)。

(From a In db.Payments 
Select a 
, TotalInterestRecieved = (From b in db.InterestCharges 
                           Where b.pid = a.pid
                           select b.Interest).DefaultIfEmpty(0).Sum() 
).ToList

编辑:

另一种选择是完全绕过 EF。在数据库中构建一个视图并直接查询该视图,而不是尝试通过 LINQ 访问底层数据。

我会提出的大多数其他建议都涉及遍历 "Payments" 的初始列表并根据需要填充值。这对于少量 "Payments" 来说很好,但这是一个 O(n) 解决方案。