Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 程序比较2个表并更新不同的记录_C#_Sql_Linq - Fatal编程技术网

C# 程序比较2个表并更新不同的记录

C# 程序比较2个表并更新不同的记录,c#,sql,linq,C#,Sql,Linq,我希望你能帮我解决我的困境 我知道有不同的方法来实现这一点,我愿意接受你的建议。我每天都在学习。但请记住我还是个新手 我正在尝试更正执行以下操作的过程: SELECT DISTINCT [Finance_Project_Number] FROM [InterfaceInfor].[dbo].[ProjectMaster] WHERE NOT EXISTS (SELECT * FROM [IMS].[dbo].[THEOPTION]

我希望你能帮我解决我的困境

我知道有不同的方法来实现这一点,我愿意接受你的建议。我每天都在学习。但请记住我还是个新手

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

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])
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();
    }
}
  • 它查找所有不存在的不同记录
  • 将[THEOPTION].[NAME]字段与[ProjectMaster].[Finance\u Project\u Number]字段进行比较
  • 它会更新不存在的不同记录
  • 首先;在SQL中执行DISTINCT select时,得到以下值:6982

    但是我的过程中应该复制这个结果的代码行返回的结果比我在DB:15995中的总记录少100条记录

    这是一行:

    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])
    
    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();
        }
    }
    
    下面是我完整的C#程序:

    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])
    
    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();
        }
    }
    

    提前谢谢大家

    我认为您的ProjectMaster实体不会覆盖
    Equals
    GetHashCode
    ,但这两个实体都需要
    Distinct()
    才能正常工作

    看一看,其中提供了有关如何在分部类中重写
    Equals
    GetHashCode
    的附加信息

    在SQL查询中,对单个值调用distinct,在LINQ查询中,对ProjectMaster中的完整记录调用distinct

    执行相同的查询(所有不同的财务项目编号)在SQL和LINQ中应产生相同的结果,因为字符串/Int/。。。实现
    Equals()

    如果不想实现
    等于
    ,可以使用此列表使用以下查询选择所有记录:

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

    查找和更新不存在的记录是一个很难掌握的概念。这是什么意思?@DanBracuk我正在尝试查找选项表中不存在但项目主控表中确实存在的所有记录(按标识符)。但只有不同的记录。由于CRUD操作,每个标识符有多条记录。希望这有意义!感谢您的反馈和见解。我在LINQ查询中调用完整记录的原因是我需要更新特定记录。我确实读了你建议的帖子(谢谢:),但我还是太新/太绿,无法完全理解如何实现这是我的代码。我还使用了两个数据源,这使问题有点复杂。我可以请你给我一些关于我的特定代码的建议吗?非常感谢你!更新:我尝试了您提交的LINQ查询,但由于该查询只返回Finance\u Project\u编号,因此我的更新方法不起作用。我需要这方面的完整记录。有没有一种方法可以让这个LINQ查询仍然更新一个匹配的记录!我明白你的意思了。然而,一个小嗝;我在.ToList()上得到一个错误;此查询的一部分:var records=stageContext.ProjectMasters.Where(u=>financeProjectNumbers.Contains(u.Finance_Project_Number).ToList();错误:“bool”不包含“”的定义,并且找不到接受类型为“bool”的第一个参数的扩展方法“”(是否缺少using指令或程序集引用?)有一个结束括号不见了;)谢谢,马克-我把它整理好了。谢谢你的帮助!