2016-09-23 85 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插入数据。

相关问题