如何将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
相关产品推荐
相关产品推荐

