代码之家  ›  专栏  ›  技术社区  ›  Sapri s

比较两个列表<T>对象并使用c中的linq更新第一个对象和第二个对象#

  •  0
  • Sapri s  · 技术社区  · 1 年前

    我有一个Excel文件,里面有一组记录,还有一个名为UserTable的数据库,里面有一些记录。我正在做的是将这两个记录与名为UserId的字段进行比较。UserTable中有一些字段的值为null,也有一些字段为值。如果我将Excel与数据库(UserTable)记录进行比较,它必须获取所有字段中都有值的更新记录。 我变了

    我试过这个:

        public class UpdateData
        {
            public void Update(List<UserTable> users, List<UserTable> mappeddata)
            {
                //var result = from values in mappeddata join values2 in users on values.UserId equals values2.UserId select values;
                var valuestobeupdated = from m1 in mappeddata
                              join m2 in users on m1.UserId equals m2.UserId
                              where m1.ManagerUserId != m2.ManagerUserId
                                || m1.Department != m2.Department
                                || m1.Title != m2.Title ||  m1.Email != m2.Email || m1.FirstName != m2.FirstName    
                              select m1;
                Console.WriteLine("Updated");
    
            }
        }
    

    但是这是区分大小写的,例如如果在user&&在mappeddata中,UserId=a24070不匹配,其他字段也是如此。 有没有办法使它不区分大小写 例如,我在另一份声明中这样做 var userIdnotinTable=userIdinExcel.Except(userIdinTable, StringComparer.OrdinalIgnoreCase); 有这样的例子吗?或者有其他方法吗?

    谢谢

    0 回复  |  直到 1 年前
        1
  •  0
  •   LukasKroess    1 年前

    你可以一直 .ToLower() 等式的两面,但根据数据量的不同,它可能会带来显著的性能影响。

    编辑:

    在考虑性能时,重要的是要了解任务是定期执行还是仅手动执行一次(或几次):

    对于现代系统来说,将两个~8个字符的字符串转换为小写x 200000仍然不是一项伟大的壮举,但如果要执行这项任务,比如说,每10分钟执行一次,那么额外的ms就会开始增加,并在CPU时间内引起注意(这意味着服务器成本会增加)。

    如果你需要做一次——我会说,绝对要去做。

        2
  •  0
  •   Dharman Aman Gojariya    1 年前

    请注意,数据净化是性能的重要组成部分。

    请注意,您真正的问题是两个数据集中可用的数据缺乏标准化。

    您真正应该做的是编写任何低效的逻辑来“匹配”记录,然后用“固定”的用户ID更新数据库(例如,将数据库记录从a24070更新到a24070)

    这可以是一个单独的一次性脚本,您将运行(并支付一次性能惩罚),并且您的重复作业的比较逻辑不需要处理大小写问题。

    这还假设您用小写数据识别污染数据库的系统,并修复代码,这样坏数据就不会不断出现。

    简而言之,您正专注于 wrong problem