2016-01-23 64 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