过程比较2个表并更新DISTINCT记录

时间:2016-01-23 15:43:39

标签: c# sql linq

我希望你能帮助我解决困境。

我知道有不同的方法来实现这一目标,我对你的建议持开放态度。我每天都在学习。但请记住我还是个新手。 :)

我正在尝试更正执行以下操作的过程:

  1. 找到所有不存在的不同记录
  2. 将[THEOPTION]。[NAME]字段与[ProjectMaster]进行比较。[Finance_Project_Number]字段
  3. 它更新不存在的不同记录
  4. 首先关闭;当我在SQL中执行DISTINCT select时,我得到这个值:6982。

    但我的过程中应该复制此结果的代码行返回的结果是数据库中我的总记录少数100条记录:15 995

    这是一行:

    var deltaList = stageContext.ProjectMasters.ToList().Where(u => !allProjectNames.Contains(u.Finance_Project_Number)).Distinct().ToList();
    

    这是我的SQL查询:

    SELECT DISTINCT [Finance_Project_Number]
    FROM [InterfaceInfor].[dbo].[ProjectMaster]
    WHERE NOT EXISTS (SELECT *
                            FROM [IMS].[dbo].[THEOPTION]  
                            WHERE [InterfaceInfor].[dbo].[ProjectMaster].[Finance_Project_Number] = [IMS].[dbo].[THEOPTION].[NAME])
    

    以下是我完整的C#程序:

    public static void NewRecords()
    {
        using (var stageContext = new StagingTableDataContext())
        {
            using (var destinationContext = new DestinationTableDataContext())
            {
                var allProjectNames = destinationContext.THEOPTIONs.Select(u => u.NAME).ToList(); //12 622
                var deltaList = stageContext.ProjectMasters.ToList().Where(u => !allProjectNames.Contains(u.Finance_Project_Number)).Distinct().ToList(); //15 300
    
                deltaList.ForEach(u => u.Processing_Result = 0);
                deltaList.ForEach(u => u.Processing_Result_Text = "UNIQUE");
    
            }
            stageContext.SubmitChanges();
        }
    }
    

    提前谢谢大家!

1 个答案:

答案 0 :(得分:1)

我认为您的ProjectMaster实体未覆盖EqualsGetHashCode,但两者都需要Distinct()才能正常工作。

查看this post,其中提供了有关如何在部分课程中覆盖EqualsGetHashCode的其他信息。

在SQL查询中,您在一个值上调用distinct,在LINQ查询中,您在ProjectMaster中的完整记录上调用distinct。

执行相同的查询(所有不同的Finance_Project_Number)应该在SQL和LINQ中产生相同的结果,因为String / Int / ...实现Equals()

var financeProjectNumbers = stageContext.ProjectMasters.Select(u => u.Finance_Project_Number).Where(u => !allProjectNames.Contains(u)).Distinct().ToList();

如果您不想实施Equals,可以使用此列表使用以下查询选择所有记录:

var records = stageContect.ProjectMasters.Where(u => financeProjectNumbers.Contains(u.Finance_Project_Number)).ToList();