C#使用LINQ查询含'-'字符的DataTable列报错如何解决
报错原因
DataTable.Select() 所用的过滤表达式有独立的解析规则,连字符 - 在规则中属于算术减号运算符,因此表达式里写 SUB-CATEGORY 时,解析器会把它判定为「取SUB列的值减去CATEGORY列的值」的运算逻辑,查找不到名为SUB的列时就会抛出对应错误。
解决方法
- 适配现有代码的最小修改:对包含特殊字符(连字符、空格、关键字冲突等)的列名,用方括号
[]包裹,显式声明这是完整列名即可。
修正后的代码:
DataRow[] matches = myTable.Select("[SUB-CATEGORY] = '" + sc + "' AND BW = '" + bw + "'");
- 补充转义注意:如果传入的参数
sc、bw本身包含单引号,需要先将单引号替换为两个连续单引号做转义,否则会触发表达式语法错误,处理示例:
sc = sc.Replace("'", "''"); bw = bw.Replace("'", "''"); DataRow[] matches = myTable.Select("[SUB-CATEGORY] = '" + sc + "' AND BW = '" + bw + "'");
- 不想记忆过滤表达式的特殊规则的话,可以直接使用标准LINQ to DataSet写法,这类写法直接按字符串匹配列名,不会把连字符识别为运算符,不需要额外包裹列名:
DataRow[] matches = myTable.AsEnumerable() .Where(r => r.Field<string>("SUB-CATEGORY") == sc && r.Field<string>("BW") == bw) .ToArray();
内容的提问来源于stack exchange,提问作者waslow
相关产品推荐
相关产品推荐

