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

为什么空表时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:24:02