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

使用Dynamic LINQ对DataTable分组求和时处理DBNull值异常

解决Dynamic LINQ处理DataTable求和时的DBNull空值异常

问题核心

在Dynamic LINQ中对DataTable列求和时,若列存在DBNull值,直接转换会抛出Object cannot be cast from DBNull to other types.异常,需要在求和前先判断并替换空值。

错误点分析

你之前的代码有两个关键问题:

  • 三元运算符不完整,缺少空值对应的默认值(应该是0)
  • Sum内部错误嵌套了new(),Sum是对单个数值求和,不需要包裹对象

修正后的代码

public bool CreateConsolidation(string sum_Column) // e.g. Column9 will pass as sum_Column
{
    // 构建空值处理后的求和表达式:空值替换为0,非空值转int
    var sumExpr = $"it.{sum_Column} == DBNull.Value ? 0 : Convert.ToInt32(it.{sum_Column})";

    // 分组后直接对处理后的表达式求和,无需嵌套new
    var double_grouping = dt_excel.AsEnumerable().AsQueryable()
        .GroupBy("new (it.Column4, it.Column5, it.Column6, it.Column7, it.Column11)", "it")
        .Select($"new (Key.Column4 as Column4, Key.Column5 as Column5, Key.Column6 as Column6, Key.Column7 as Column7, Key.Column11 as Column11, Sum({sumExpr}) as QTY)")
        .ToDynamicList();

    // 后续操作
    return true;
}

关键说明

  1. 空值替换逻辑:通过三元运算符it.{sum_Column} == DBNull.Value ? 0 : Convert.ToInt32(it.{sum_Column}),将所有DBNull值替换为0,避免转换异常。
  2. Sum表达式简化:直接将处理后的数值表达式传入Sum,不需要额外包裹new(),因为Sum方法接受的是单个数值类型的表达式,而非对象。
  3. Dynamic LINQ语法兼容:使用it.列名的方式访问DataRow的列,Dynamic LINQ框架会自动解析为DataRow的索引器访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:39:51