在.NET中插入之前检查记录是否存在的最有效方法

时间:2016-09-23 18:58:33

标签: c# sql

我正在解析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。感谢。

2 个答案:

答案 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插入数据。