Visual C#:用Linq筛选DataTable中存在/不存在于另一表的记录
当然可以!完全不用写繁琐的for循环,用LINQ就能干净利落地搞定这两个筛选需求。结合你给出的示例数据,我来一步步给你演示:
示例数据
DataTable A
| ID | Value |
|---|---|
| 2 | 7 |
| 2 | 3 |
| 3 | 5 |
| 5 | 6 |
| 7 | 2 |
| 7 | 5 |
| 7 | 4 |
DataTable B
| ID | Value |
|---|---|
| 1 | 3 |
| 1 | 9 |
| 2 | 4 |
| 4 | 6 |
| 4 | 2 |
| 7 | 4 |
| 9 | 3 |
一、筛选A中ID存在于B的记录
核心思路是先把B里所有不重复的ID提取出来(减少重复判断,提升效率),然后用Contains方法筛选A中ID在这个集合里的行。
代码实现:
// 从DataTable B中提取所有唯一ID var bUniqueIds = dtB.AsEnumerable() .Select(row => row.Field<int>("ID")) .Distinct(); // 筛选A中ID存在于B的记录,转成新的DataTable var aRecordsInB = dtA.AsEnumerable() .Where(row => bUniqueIds.Contains(row.Field<int>("ID"))) .CopyToDataTable();
筛选结果:
| ID | Value |
|---|---|
| 2 | 7 |
| 2 | 3 |
| 7 | 2 |
| 7 | 5 |
| 7 | 4 |
二、筛选A中ID不存在于B的记录
逻辑几乎一致,只需要在Contains前加个取反运算符!即可。
代码实现:
// 复用之前提取的bUniqueIds集合 var aRecordsNotInB = dtA.AsEnumerable() .Where(row => !bUniqueIds.Contains(row.Field<int>("ID"))) .CopyToDataTable();
筛选结果:
| ID | Value |
|---|---|
| 3 | 5 |
| 5 | 6 |
小提醒:如果筛选后的结果为空,直接调用
CopyToDataTable()会抛出异常。可以先判断是否有结果再处理:var filteredRows = dtA.AsEnumerable().Where(...); var resultTable = filteredRows.Any() ? filteredRows.CopyToDataTable() : dtA.Clone();
内容的提问来源于stack exchange,提问作者Pikachu620
相关产品推荐
相关产品推荐

