使用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; }
关键说明
- 空值替换逻辑:通过三元运算符
it.{sum_Column} == DBNull.Value ? 0 : Convert.ToInt32(it.{sum_Column}),将所有DBNull值替换为0,避免转换异常。 - Sum表达式简化:直接将处理后的数值表达式传入Sum,不需要额外包裹
new(),因为Sum方法接受的是单个数值类型的表达式,而非对象。 - Dynamic LINQ语法兼容:使用
it.列名的方式访问DataRow的列,Dynamic LINQ框架会自动解析为DataRow的索引器访问。
内容的提问来源于stack exchange,提问作者JKANNAN
相关产品推荐
相关产品推荐

