C#中如何查询DataTable并检查是否存在重复记录?
C# 中 DataTable 检查重复记录的实现方法
C# 中完全可以实现和你给出的SQL语句等价的逻辑,常见有两种实现方案:
方案1:使用LINQ查询(语法更接近SQL,可读性高)
需要先引入对应命名空间,且项目需引用System.Data.DataSetExtensions程序集(.NET Framework和.NET Core/.NET 5+默认都带,无需额外安装)。
引用命名空间
using System; using System.Linq; using System.Data;
代码示例(查询指定JobNum和ProcessNum的记录数)
// 替换为你自己的DataTable实例 DataTable dt = GetYourDataTable(); string targetJob = "1234"; string targetProcess = "5678"; var result = dt.AsEnumerable() // 对应SQL的where条件 .Where(r => r.Field<string>("JobNum") == targetJob && r.Field<string>("ProcessNum") == targetProcess) // 对应SQL的group by两列 .GroupBy(r => new { Job = r.Field<string>("JobNum"), Process = r.Field<string>("ProcessNum") }) // 对应SQL的select count、两列字段 .Select(g => new { Count = g.Count(), JobNum = g.Key.Job, ProcessNum = g.Key.Process }) .FirstOrDefault(); if (result != null) { Console.WriteLine($"记录数:{result.Count},JobNum:{result.JobNum},ProcessNum:{result.ProcessNum}"); // 大于1即为存在重复 if (result.Count > 1) { Console.WriteLine("存在重复记录"); } } else { Console.WriteLine("未找到匹配记录"); }
注意:如果你的JobNum和ProcessNum字段是int类型,把代码中的Field<string>替换为Field<int>即可,同时去掉字段值的引号。
方案2:使用DataTable原生Select方法(无需额外依赖)
直接用DataTable自带的筛选方法,写法更简单,适合轻量场景:
DataTable dt = GetYourDataTable(); // 对应SQL的where条件 string filter = "JobNum = '1234' AND ProcessNum = '5678'"; DataRow[] matchedRows = dt.Select(filter); int count = matchedRows.Length; Console.WriteLine($"匹配记录数:{count}"); if (count > 1) { Console.WriteLine("存在重复记录"); }
额外场景:查询全表所有重复的JobNum+ProcessNum组合
如果不需要指定具体值,要查整个表中所有重复的组合,直接用以下LINQ代码即可:
var duplicates = dt.AsEnumerable() .GroupBy(r => new { Job = r.Field<string>("JobNum"), Process = r.Field<string>("ProcessNum") }) .Where(g => g.Count() > 1) .ToList(); if (duplicates.Any()) { Console.WriteLine($"共找到{duplicates.Count}组重复记录:"); foreach (var dup in duplicates) { Console.WriteLine($"JobNum:{dup.Key.Job},ProcessNum:{dup.Key.Process},重复次数:{dup.Count()}"); } }
内容的提问来源于stack exchange,提问作者LJH
相关产品推荐
相关产品推荐

