如何用LINQ查询找出DataTable中工号重复但用户名不同的数据?
解决DataTable筛选工号重复且用户名不同记录的LINQ方案
我来帮你搞定这个问题!你需要的是从DataTable里找出工号重复但对应用户名不唯一的记录,然后按指定格式输出。之前的LINQ没得到结果,大概率是没加对筛选条件——不仅要工号重复,还要组内的用户名存在差异。
完整实现代码
假设你的DataTable名为mergedDt,列名和你描述的一致("Worknumber(工号)"和"Username(用户名)"),可以用下面的LINQ查询:
// 1. 按工号分组,筛选出符合条件的组 var targetGroups = mergedDt.AsEnumerable() .GroupBy(row => row.Field<string>("Worknumber(工号)")) .Where(group => group.Count() > 1 // 工号有重复记录 && group.Select(r => r.Field<string>("Username(用户名)")).Distinct().Count() > 1); // 组内用户名不唯一 // 2. 遍历组,按指定格式输出 foreach (var group in targetGroups) { var worknumber = group.Key; // 拼接去重后的用户名(避免重复输出同一用户名) var usernameStr = string.Join(" ", group.Select(r => r.Field<string>("Username(用户名)")).Distinct()); Console.WriteLine($"{worknumber} {usernameStr}"); }
代码解释
AsEnumerable():把DataTable转换为支持LINQ查询的IEnumerable<DataRow>集合,这是对DataTable使用LINQ的前提。GroupBy(row => row.Field<string>("Worknumber(工号)")):将所有记录按工号分组,同一个工号的记录会被归为一组。Where筛选条件:group.Count() > 1:确保该工号存在多条记录(即工号重复);group.Select(r => r.Field<string>("Username(用户名)")).Distinct().Count() > 1:确保组内的用户名去重后数量大于1,也就是存在不同的用户名(排除像1235那样工号重复但用户名完全相同的情况)。
- 输出处理:用
Distinct()去重用户名(如果同个工号下有重复的用户名,比如1236 Donald、1236 Jack、1236 Donald,去重后只保留一次Donald),再用string.Join拼接成空格分隔的字符串,最后和工号组合输出。
注意事项
- 确保列名完全匹配:DataTable的列名必须和你代码里写的
"Worknumber(工号)"、"Username(用户名)"完全一致(包括中文、括号、大小写),否则Field<string>会抛出异常。如果你的列名是纯英文(比如"Worknumber"、"Username"),记得修改代码里的字段名。 - 如果工号是数值类型(比如int),把
row.Field<string>改成row.Field<int>即可。
内容的提问来源于stack exchange,提问作者10101
相关产品推荐
相关产品推荐

