You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;
        }
    } 
}

补充优化点

  1. 修复代码笔误:GetHashCode方法中obj.Title?.ToLower().GetHashCode() ? 0需改为obj.Title?.ToLower().GetHashCode() ?? 0,否则会出现编译错误。
  2. 完成更新逻辑:当前代码仅筛选出了需要更新的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;
        // 同步其余需要更新的字段
    }
}
  1. 空值处理:如果UserTable中存在值类型字段,需在比较器的Equals方法中补充对应的值比较逻辑,避免遗漏。

内容的提问来源于stack exchange,提问作者Sapri s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:40:19