You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将decimal类型变量转换为可空decimal类型且不修改原有属性

解决方案

核心修改思路:由于你的PaidAmount属性为非可空decimal值类型,默认情况下LINQ的FirstOrDefault()对值类型只会返回对应默认值(也就是0),不会返回null。要让PreviousPaidAmount变量变为可空decimal类型(decimal?),只需要在投影时显式转换为可空类型即可,不需要修改原有属性定义。

修改后可直接运行的代码

// 显式声明变量为可空decimal,投影时做类型转换
decimal? PreviousPaidAmount = _db.SEPayments.Where(v => v.Invoice == items).Select(c => (decimal?)c.PaidAmount).FirstOrDefault();
SEPayment del = _db.SEPayments.Where(a => a.Invoice == items).FirstOrDefault();
if (PreviousPaidAmount == null)
{
    break;
}
else
{
    // 原有重复查询逻辑可直接删除,复用上方已查询到的结果即可
    var Paid = del.PaidAmount;
    Paid -= PreviousPaidAmount.Value; // 可空类型取值用.Value
    _db.Entry(del).State = EntityState.Modified;
    _db.SaveChanges();
}

关键修改点说明

  • 变量声明时显式指定类型为decimal?(即可空decimal)
  • 在Select投影时将非可空的c.PaidAmount强制转换为(decimal?)c.PaidAmount,此时如果匹配不到数据,FirstOrDefault()就会返回null而非默认值0
  • 后续使用PreviousPaidAmount的值时,用.Value属性取实际的decimal值即可(因为前面已经判断了不为null,所以不会报空引用错误)

额外优化建议

你原有代码对同一个条件的SEPayment做了多次重复查询,性能开销大,可以简化为只查一次:

SEPayment del = _db.SEPayments.Where(a => a.Invoice == items).FirstOrDefault();
if (del == null)
{
    break;
}
// 直接用查到的del对象取值,不需要额外查询
decimal PreviousPaidAmount = del.PaidAmount;
var Paid = del.PaidAmount;
Paid -= PreviousPaidAmount;
_db.Entry(del).State = EntityState.Modified;
_db.SaveChanges();

内容的提问来源于stack exchange,提问作者Genkozal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:48:03