EF 到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。(转载)
解决方案:
DateTime? date = dbfw.TMS10min.Select(d => (DateTime?)d.TIMESTAMP).Max();
decimal? sum = _member.DbSet
.Where(q => q.MemberID == 11)
.Sum(q => (decimal?)q.ActiveAmount); //核心
转载来源:https://blog.csdn.net/u011127019/article/details/53909325
一、使用EF访问数据库求和时经常遇到这样的异常
“System.InvalidOperationException”类型的未经处理的异常在 EntityFramework.dll 中发生
其他信息: 到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可以为 null 的类型。
截图:
异常代码1:
-
decimal sum = _member.DbSet
-
.Where(q => q.MemberID == 11)
-
.Sum(q => q.ActiveAmount);
异常代码2:
-
decimal sum = _member.DbSet.Where(q => q.MemberID == 11)
-
.Select(q => q.ActiveAmount)
-
.Sum();
二、原因:
抛出的原因:根据条件从数据库筛选出的数据为空,然后求和就抛出异常了。
解决方案:根据条件将筛选字段或数据行取到内存后,在求和
-
//将数据库数据拿到内存再求和
-
decimal sum = _member.DbSet.Where(q => q.MemberID == 11)
-
.Select(q => q.ActiveAmount)
-
.ToList()
-
.Sum();
解决方案2:如果根据条件当筛选数据行不存在时,求和结果需要指定为null时,可以这样处理
-
decimal? sum = _member.DbSet
-
.Where(q => q.MemberID == 11)
-
.Sum(q => (decimal?)q.ActiveAmount); //核心
解决方案3(推荐):使用DefaultIfEmpty()
http://blog.csdn.net/u011127019/article/details/61413670
一、字符串类型最大值
1.字符串类型的最大值,和数据库的字典排序最后一个相同,如果存在返回null
-
//字符串最大值,是字典排序最后一个
-
string max1 = _context.students.Max(q => q.sname);
-
Console.WriteLine(max1);
-
-
//字符串最大值,如果不存在返回null
-
string max2 = _context.students
-
.Where(q => false)
-
.Max(q => q.sname);
-
Console.WriteLine(max2);
-
Console.WriteLine(max2 == null); //True
-
Console.WriteLine(max2 == ""); //False
二、数字类型最大值
1.数字类型最大值,和数据库字段排序最后一个相同,如果没有数据抛出异常。
-
//数字类型,获取最大值为正序排列最后一个值
-
decimal deci1 = _context.scores.Max(q => q.degree);
-
Console.WriteLine(deci1);
数字类型,获取条件的数据不存在抛出异常
其他信息: 到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。
结果类型的泛型参数或查询必须使用可以为 null 的类型。
-
decimal deci2 = _context.scores.Where(q => false).Max(q => q.degree);
-
Console.WriteLine(deci2);
解决方案1:
-
//解决方案1,使用DefaultIfEmpty(),推荐
-
var query = _context.scores.Where(q => false)
-
.Select(q => q.degree)
-
.DefaultIfEmpty();
-
Console.WriteLine(query.ToString());
-
decimal deci3 = query
-
.Max();
-
Console.WriteLine(deci3);
生成sql如下:
解决方案2:
-
//解决方案2,先判断再取值,执行两次数据库查询
-
decimal deci4 = 0;
-
if (_context.scores.Any())
-
{
-
deci4 = _context.scores.Max(q => q.degree);
-
}
-
Console.WriteLine(deci4);
解决方案3:
-
//解决方案3,内存取最大值
-
decimal deci5 = _context.scores
-
.Select(q => q.degree)
-
.ToList()
-
.Max();
-
Console.WriteLine(deci5);
-
更多:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-11-11 向方法传递结构和向方法传递引用之间的区别 总结