【问题标题】:Cast to double failing? [duplicate]投双倍失败? [复制]
【发布时间】:2016-07-11 07:21:23
【问题描述】:

我无法弄清楚为什么这无法投射。它说它为空,但绝不应该是这种情况,因为我正在检查它是否为空并将其替换为 0,对吗?

        var BF = (double)filtered.Sum(s => s.fees
           .Where(w => w.status == "B")
           .Sum(su => su.amount ?? 0));

错误: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.

我有一个对象列表,每个对象都包含一个 fees 列表,其中包含一个可以为空的小数 amount,我只需要总结这些数量。我错过了什么?

【问题讨论】:

  • 试试:.Sum(su => su.amount ?? 0D));
  • 您是否尝试搜索该错误?没有行,导致Sum()(或者更确切地说从查询结果到请求类型的变量的具体化)失败并出现这个神秘的异常。
  • 如果 su.amount 可以为空,使用:Sum(su => su.amount ? su.amount.Value : 0m));
  • 那么您实际上是在投射到double 还是decimal?您显示的代码与您显示的错误不匹配...
  • 不相关,但您是否有理由将一个非常好的小数转换为一个非常糟糕的双倍,以获得一个看似财务的价值?

标签: c# entity-framework linq lambda


【解决方案1】:

由于.Sum() 在空集上完成时将返回null,我建议使用.DefaultIfEmpty(0) 以确保您避免在这种情况下遇到空值。

为了限制集合,我还建议过滤掉空值。

var BF = (double)filtered.Sum(s => s.fees
       .Where(w => w.status == "B" && w.amount != null)
       .Select(su => su.amount)
       .DefaultIfEmpty(0)
       .Sum());

【讨论】:

  • 我认为这行不通。此 LINQ 被转换为 SQL,并返回到 decimal 的响应,后一部分因没有行而失败。
  • @CodeCaster - 如果你对一个空集求和,它应该返回 0。我不认为没有行方面(如果真的没有行的话)在这里起作用。
  • SELECT SUM(f) WHERE 1=0 返回NULL。就是 NULL 无法转换回请求的不可为空的 decimal
  • @CodeCaster 是对的,我得到了它与建议的组合。
  • @CodeCaster - 我明白了,你是对的。我将进行编辑。
【解决方案2】:

试试这个:

var BF = (double)filtered.Sum(s => s.fees.Where(w => w.status == "B").Sum(su => su.amount ?? 0) ?? 0);

也许内部 lambda "s.fees.Where(w => w.status == "B").Sum(su => su.amount ?? 0)" 返回 null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2012-10-31
    • 2011-12-03
    • 2014-02-28
    • 2019-07-10
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多