如何使用LINQ从含不同数据类型列的DataTable中查询记录?
问题分析与解决
异常原因
出现“指定的转换无效”通常是以下情况导致:
YEAR列的实际数据类型不是int(比如是string、long或decimal),强行用Field<int>转换失败VALUE列的实际数据类型不是double(比如是decimal、int或string),转换时类型不匹配- 目标单元格存在
DBNull值,直接调用Field<T>会触发转换异常
修复方案
1. 先确认列的实际数据类型
查看DataTable定义或数据源,确认YEAR和VALUE列的真实类型,比如YEAR可能是字符串类型,VALUE可能是数据库常用的decimal类型,需对应调整转换方式。
2. 安全获取单个值并转为字符串
因为你需要的是单个值,无需foreach遍历,直接用FirstOrDefault或SingleOrDefault获取,同时处理空值和类型转换问题:
示例1:适配数据库常见类型(YEAR为int、VALUE为decimal)
// 筛选匹配行,同时排除VALUE为空的情况 var targetRow = dt.AsEnumerable() .FirstOrDefault(dc => dc.Field<int>("YEAR") == 201803 && !dc.IsNull("VALUE")); string resultStr = string.Empty; if (targetRow != null) { // 用Convert.ToString兼容多种数值类型,直接转字符串 resultStr = Convert.ToString(targetRow["VALUE"]); }
示例2:YEAR为字符串类型(如数据库存"201803")
var targetRow = dt.AsEnumerable() .FirstOrDefault(dc => dc.Field<string>("YEAR") == "201803" && !dc.IsNull("VALUE")); string resultStr = targetRow != null ? Convert.ToString(targetRow["VALUE"]) : string.Empty;
示例3:通用兼容方案(不确定列类型时)
用Convert类做转换,避免强类型转换异常:
var result = dt.AsEnumerable() .Where(dc => Convert.ToInt32(dc["YEAR"]) == 201803 && !dc.IsNull("VALUE")) .Select(dc => Convert.ToString(dc["VALUE"])) .FirstOrDefault(); // result即为目标字符串,无匹配数据时返回null
注意事项
- 优先用
FirstOrDefault/SingleOrDefault获取单个值,比foreach更高效 - 必须先判断单元格是否为
DBNull,避免空值转换异常 Convert类转换比Field<T>更灵活,兼容更多数据类型场景
内容的提问来源于stack exchange,提问作者Gaurav Mali
相关产品推荐
相关产品推荐

