使用EF6从表中删除数千行

时间:2018-05-30 09:47:20

标签: c# asp.net-mvc linq entity-framework-6

您好我正在尝试使用.net mvc应用程序中的EF6从表中删除4-5k行

我正在使用RemoveRange,如果它的100-200行,它会在几秒钟内完成。但是当我尝试删除几千条记录时,需要很长时间(10分钟+)

using (someEntites dc = new someEntites())
                    {
                        var listForRemoval = (from a in dc.someTable
                                         where a.Year == 2018 && a.month == 04
                                         select a).ToList();

                        if (listForRemoval != null)
                        {
                            dc.someTable.RemoveRange(listForRemoval);
                            dc.SaveChanges();
                        }
                    }

我尝试禁用AutoDetectChangesEnabled,但这没有帮助。

是否还有其他(相对简单的)方法可以从db表中删除更大的数据块?

- p.s编写简单删除 - 在sql中需要一秒钟才能完成

3 个答案:

答案 0 :(得分:2)

你可以尝试这样:

using (someEntites dc = new someEntites())
{
    //var listForRemoval = (from a in dc.someTable
    //where a.Year == 2018 && a.month == 04
    //select a).ToList();

    //if (listForRemoval?.Count > 0)
    //{
    //dc.someTable.RemoveRange(listForRemoval);
    //dc.SaveChanges();
    //}

    dc.Database.ExecuteSqlCommand("DELETE FROM someTable " + 
                                  "WHERE Year = {0} " + 
                                  "AND month = {1}", 2018, 4); 
    // Executes a commande with parameters. You can add more parameters separated by ','.
}

如果与其他表有关系,则应单独删除它们。

答案 1 :(得分:1)

您可以尝试使用Entity Framework执行原始SQL查询。更多详情请见:

https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx

答案 2 :(得分:1)

您正在使用的方法并不是最好的方法,因为当您使用.ToList()然后删除时,您正在加载要在内存中删除的所有记录。想象一下,每个请求都会加载数千条记录。 这里要实现的是以下示例:

string statement= "DELETE FROM sometable WHERE year = 2018 AND month = 4";
dc.Database.SqlQuery(statement);

完整教程:http://www.entityframeworktutorial.net/entityframework4.3/raw-sql-query-in-entity-framework.aspx