我正在解析JSON数据并将记录插入SQL中的表中。问题是数据量并且必须在插入之前的循环中检查每个记录,这会减慢程序的速度。
我使用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;
}
我已经看过其他建议,比如保存到临时表并执行合并但不知道如何实现。
在插入之前检查delta数据的最有效方法是什么?
我在.NET中使用Entity Framework 6和MVC 5。感谢。
答案 0 :(得分:0)
当你说&#34; SQL&#34;你的意思是MS SQL Server。如果是这样,那么看一下MERGE语句。你可以为MERGE语句提供一个记录集来处理它,它将决定它是否存在(在sql-speak中是MATCH),你可以决定是否相应地INSERT / UPDATE / ignore。
答案 1 :(得分:0)
如果没有数据库设计和插入代码,很难回答这个问题。虽然您可以尝试使用当前的代码来尝试提高效率。
1)将您的每个更改为Parallel.ForEach,以便您可以同时检查多个记录
2)我也相信db查询FirstOrDefault比Any
更有效=====
如果这仍然不够有效,我会考虑编写自己的存储过程,并调用它并使用SQLBulkCopy插入数据。