如何用C# Linq匹配UserId并更新List<UserTable>中不一致记录
用Excel数据更新数据库UserTable记录的实现
需求
我有一份包含记录的Excel文件,以及名为UserTable的数据库表。已将两者数据转换为List<UserTable>集合,需要通过UserId字段匹配,用Excel数据(对应代码中的mappeddata)更新数据库数据(对应代码中的users):当UserId匹配但其他字段存在差异时,更新数据库集合中的对应记录。
已尝试的代码
public void Update(List<UserTable> users, List<UserTable> mappeddata) { // 筛选出Excel中与数据库存在相同UserId的记录 var valuetoupdate = mappeddata.IntersectBy(users.Select(y => y.UserId), y => y.UserId, StringComparer.OrdinalIgnoreCase); // 通过自定义比较器找出字段有差异的记录 var rowsToUpdate = valuetoupdate.Except(users, new UserTableEqualityComparer()); } // 自定义比较器:判断除UserId外的字段是否完全一致 public class UserTableEqualityComparer : IEqualityComparer<UserTable> { public bool Equals(UserTable x, UserTable y) { if (x == null || y == null) return false; else return (string.Equals(x.ManagerUserId, y.ManagerUserId, StringComparison.OrdinalIgnoreCase) && string.Equals(x.Department, y.Department, StringComparison.OrdinalIgnoreCase) && string.Equals(x.Title, y.Title, StringComparison.OrdinalIgnoreCase) ...// 其余需要比较的字段 ); } public int GetHashCode(UserTable obj) { unchecked { int hash = 17; hash = hash * 23 + (obj.ManagerUserId?.ToLower().GetHashCode() ?? 0); hash = hash * 23 + (obj.Department?.ToLower().GetHashCode() ?? 0); // 注意:此处原代码有笔误,需将?改为?? hash = hash * 23 + (obj.Title?.ToLower().GetHashCode() ?? 0); ...// 其余字段的哈希计算 return hash; } } }
补充优化点
- 修复代码笔误:
GetHashCode方法中obj.Title?.ToLower().GetHashCode() ? 0需改为obj.Title?.ToLower().GetHashCode() ?? 0,否则会出现编译错误。 - 完成更新逻辑:当前代码仅筛选出了需要更新的Excel记录,还需将这些记录的字段值同步到数据库集合中:
// 优化:将数据库集合转为字典,提升查找效率(适合数据量较大的场景) var userDict = users.ToDictionary(u => u.UserId.ToLower(), u => u, StringComparer.OrdinalIgnoreCase); foreach (var excelUser in rowsToUpdate) { if (userDict.TryGetValue(excelUser.UserId.ToLower(), out var dbUser)) { // 同步字段值 dbUser.ManagerUserId = excelUser.ManagerUserId; dbUser.Department = excelUser.Department; dbUser.Title = excelUser.Title; // 同步其余需要更新的字段 } }
- 空值处理:如果
UserTable中存在值类型字段,需在比较器的Equals方法中补充对应的值比较逻辑,避免遗漏。
内容的提问来源于stack exchange,提问作者Sapri s
相关产品推荐
相关产品推荐

