2016-09-23 134 views
0

我通過解析JSON數據並將記錄插入到SQL中的表中。問題在於數據量太大,必須在插入之前在循環中檢查每條記錄,這會減慢程序的速度。在插入.NET之前檢查記錄是否存在的最有效方法

我正在使用AddRange()一次插入一塊數據,但檢查每個值都會導致效率問題。

下面是一個代碼片段,我在JSON數據進行循環,並檢查該值存在:

foreach (JObject item in content2) 
{ 
    try 
    { 
     Assignment assignment = JsonConvert.DeserializeObject<Assignment>(item.ToString()); 
     //Begin Assignments 
     var assignment_id = (int) item["id"]; 
     var course_id = (int) item["course_id"]; 

     if (!CheckIfAssignmentRecordExists(assignment_id)) 
     { 
      newAssignment.Add(assignment); 
      log.Info("Inserted Assignment ID: " + assignment_id + " for course id: " + course_id); 
      writeCountA = writeCountA + 1; 
     } 
     else 
     { 
      log.Info("Skipping Assignment ID: " + assignment_id);    
      skipCountA = skipCountA + 1; 
     } 
     //End Assignments 
    } 
    catch (Exception) 
    { 
     log.Info("Error Processing: " + (int) item["id"]); 
     return; 
    } 
} 

這裏是分配檢查功能:

private static bool CheckIfAssignmentRecordExists(int id) 
{ 
    var retVal = false; 
    using (var db = new DataContext()) 
    { 
     retVal = db.Assignments.Any(record => record.id == id); 
    } 
    return retVal; 
} 

我已經看到其他建議,如保存到臨時表和執行合併,但不知道如何完成。

什麼是在插入之前檢查增量數據的最有效方法?

我在.NET中使用實體框架6與MVC 5。謝謝。

+1

你目前的方法有什麼問題?對我來說它看起來不錯 – Rahul

回答

0

當你說「SQL」時,你的意思是MS SQL Server。如果是這樣,那麼看看MERGE聲明。您可以爲MERGE語句提供一個要處理的記錄集,並決定它是否存在(MATCH in sql-speak),您可以決定是否相應地插入/更新/忽略。

0

沒有你的數據庫設計和插入代碼很難回答這個問題。儘管您可以嘗試使用當前的代碼嘗試提高效率,但有幾件事情。

1)更改爲每一個Parallel.ForEach使您可以檢查多個記錄同時

2)我也相信在DB查詢FirstOrDefault比任何

更有效=====

如果仍然不夠有效,我會考慮編寫自己的存儲過程,然後調用它並使用SQLBulkCopy插入數據。

相關問題