2016-01-23 35 views
2

我希望你能帮我解决我的困境。程序比较2个表并更新DISTINCT记录

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

我试图纠正执行以下程序:

  1. 报告认为,不存在
  2. 由[THEOPTION] [NAME]字段比较所有不重复的记录。 。在[ProjectMaster] [Finance_Project_Number]字段
  3. 它更新不存在

第一关不同记录;当我在SQL中执行DISTINCT选择时,我得到这个值:6982.

但是我的程序中应该复制这个结果的代码行返回的结果是我的总记录中的几百条记录在DB: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(); 
    } 
} 

谢谢大家提前!

+0

查找和更新不存在的记录是一个难以理解的概念把握。这是什么意思? –

+0

@DanBracuk我正在尝试查找THEOPTION表中不存在的所有记录(通过标识符),但确实存在于ProjectMaster表中。但只有DISTINCT记录。由于CRUD操作,每个标识符有多个记录。希望这是有道理的! – onmyway

回答

1

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

看看this post,它提供了有关如何在部分类中覆盖EqualsGetHashCode的更多信息。

在您的SQL查询,您呼吁一个单值不同,在你的LINQ查询调用在ProjectMaster一个完整记录不同。

执行相同的查询(所有不同的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(); 
+0

感谢您的反馈和洞察力。我在LINQ查询中调用完整记录的原因是我需要更新特定记录。我确实阅读了你建议的帖子(谢谢:)),但我仍然太新/绿了,完全无法理解我可以如何实现这是我的代码。我也利用了2个数据源,使问题变得复杂一点。请问你也许给我一些关于我的具体代码的指针?非常感谢你! – onmyway

+0

更新:我已经尝试了你提交的LINQ查询,但是因为这只返回Finance_Project_Number,所以我的更新方法不起作用。我需要完整的记录。有没有办法我可以有这个LINQ查询,并且仍然更新匹配的记录? – onmyway

+0

啊!我明白你要去哪里。然而,一个小小的呃逆;我在.ToList()上得到一个错误;这个查询的一部分:var records = stageContext.ProjectMasters.Where(u => financeProjectNumbers.Contains(u.Finance_Project_Number).ToList();错误:'bool'不包含''的定义并且没有扩展方法''接受可以找到类型'bool'的第一个参数(你是否缺少使用指令或程序集引用?) – onmyway

相关问题