【问题标题】:Removing thousands of rows from table using EF6 [duplicate]使用 EF6 从表中删除数千行 [重复]
【发布时间】:2018-05-30 09:47:19
【问题描述】:

您好,我正在尝试在 .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 中需要一秒钟才能完成

【问题讨论】:

  • 你能创建一个 SQL 语句来删除行并执行 SQL 语句吗?应该比任何 EF 的东西表现得更好。
  • 相对简单快捷的方法是手动执行“DELETE”查询。现在您首先向客户端获取几千条记录,然后删除它们(查询效率低下)。 EF 还有各种“扩展”,允许使用 LINQ 语法来实现。
  • 如果您想删除所有行...您可以手动执行 TRUNCATE 查询。
  • 我已经看到了使用扩展的解决方案,并试图暂时避免这种情况。我使用 (ExecuteSqlCommand) 编写了原始查询,而且速度更快,我只是不喜欢使用直接 sql 命令。无论如何谢谢:)
  • 不是重复的 Marco,我已经看到了该主题,但它并没有解决我的问题。丹尼尔我不想删除所有记录只在哪里指定的选择

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


【解决方案1】:

你可以这样试试吗:

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 ','.
}

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

【讨论】:

  • 我认为它的 ExecuteSqlCommand 但谢谢。那将不得不这样做:)
  • 对不起 :) 我修改了我的回复。
【解决方案2】:

您使用的方法不是最好的方法,因为当您使用 .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

【讨论】:

【解决方案3】:

您可以尝试使用实体框架执行原始 SQL 查询。更多详情请见:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2012-11-13
    • 2012-10-21
    • 1970-01-01
    • 2011-09-28
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多