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)
因此它从不检查空值。似乎没有别的工作而不是没有。我试过vbNull
、isDBNull()
,都没有成功。当总和不为空时,查询工作正常。 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) 解决方案。
我有一个简单的 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)
因此它从不检查空值。似乎没有别的工作而不是没有。我试过vbNull
、isDBNull()
,都没有成功。当总和不为空时,查询工作正常。 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) 解决方案。