如何从存储过程返回的DataTable中筛选指定EmployeeID的行?
解决方案
有两种简洁的方式实现你需要的DataTable筛选逻辑,以下是具体实现:
方法一:使用DataTable原生Select方法
利用DataTable.Select()构造筛选条件,将符合条件的行导入新DataTable:
在rdr.Load(cmd.ExecuteReader());之后添加以下代码:
// 定义需要保留的EmployeeID列表 var targetEmployeeIds = new[] { "1A-111", "1A-113", "1A-114" }; // 构造SQL风格的筛选表达式 string filterExpression = $"EmployeeID IN ('{string.Join("','", targetEmployeeIds)}')"; // 获取符合条件的行数组 DataRow[] filteredRows = rdr.Select(filterExpression); // 克隆原表结构,创建空的筛选结果表 DataTable filteredDataTable = rdr.Clone(); // 将筛选后的行导入新表 foreach (DataRow row in filteredRows) { filteredDataTable.ImportRow(row); } // 替换原来的return语句,返回筛选后的表 return filteredDataTable;
方法二:使用LINQ查询(更简洁)
需要先在文件顶部添加System.Linq引用:
using System.Linq;
然后在rdr.Load(cmd.ExecuteReader());之后添加以下代码:
// 用HashSet存储目标ID,提升查找效率 var targetIds = new HashSet<string> { "1A-111", "1A-113", "1A-114" }; // 通过LINQ筛选并生成新DataTable DataTable filteredDataTable = rdr.AsEnumerable() // 先判断EmployeeID不为空,再检查是否在目标列表中 .Where(row => !row.IsNull("EmployeeID") && targetIds.Contains(row.Field<string>("EmployeeID"))) .CopyToDataTable(); return filteredDataTable;
注意事项
- 确保原DataTable中存在名为
EmployeeID的列,且数据类型为字符串 - 如果
EmployeeID可能存在DBNull值,LINQ方法中的!row.IsNull("EmployeeID")判断可以避免空引用异常 - 两种方法都会保留原DataTable的列结构,仅筛选符合条件的行
内容的提问来源于stack exchange,提问作者MyatKaung
相关产品推荐
相关产品推荐

