为什么空表时Fluent Hibernate调用Sum会抛出InvalidOperationException异常
异常原因
- 核心是SQLite聚合函数的返回特性和Fluent NHibernate的类型映射逻辑共同导致的:SQLite原生的
SUM函数对空表执行聚合时返回的是NULL,而你直接对decimal类型的Value属性调用Sum()时,Fluent NHibernate默认会按非可空值类型解析返回结果,数据库返回的NULL无法转换为非可空decimal,就会抛出InvalidOperationException。 - 你现有判断
Count() > 0的写法还存在额外性能问题:会触发两次数据库查询,一次统计行数,一次计算总和,数据量大时开销会明显升高。
最优解决方案
只需要调整Sum的投影逻辑,让Fluent NHibernate按可空类型处理返回结果即可,全程仅触发一次数据库查询,写法也非常简洁:
public decimal? GetSum(ISession dbSession) { return dbSession.Query<CashTransaction>() .Sum(s => (decimal?)s.Value) ?? 0; }
如果需要显式兼容更多特殊场景,也可以搭配DefaultIfEmpty使用:
public decimal? GetSum(ISession dbSession) { return dbSession.Query<CashTransaction>() .Select(s => (decimal?)s.Value) .DefaultIfEmpty(0) .Sum(); }
内容的提问来源于stack exchange,提问作者Gener4tor
相关产品推荐
相关产品推荐

