【问题标题】:Linq How to run queries in chunksLinq 如何分块运行查询
【发布时间】:2017-01-02 06:49:22
【问题描述】:

我有一堆删除查询,如下所示:-

DELETE FROM [Entry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
  AND Entry_Date = '2016-12-01' 
  AND Entry_Method = 'I'

所以在我的代码中,我运行这个查询列表如下:-

using (var ctx = new ApplicationDbContext(schemaName))
        {
            foreach (var item in queries)
            {
                ctx.Database.ExecuteSqlCommand(item);
            }
        }

但是由于大量的查询执行它会在sql上创建一个锁,所以我决定以块的形式执行查询,所以我找到了下面的代码:-

SET ROWCOUNT 500
delete_more:
DELETE FROM [Entry] 
    WHERE CompanyId = 1 
      AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
      AND Entry_Date = '2016-12-01' 
      AND Entry_Method = 'I'
IF @@ROWCOUNT > 0 GOTO delete_more
SET ROWCOUNT 0

现在的问题是我如何像以前通过ctx.Database.ExecuteSqlCommand 运行它一样运行这个东西?

我可以在 Linq 中运行这个块查询代码的方式是什么?

【问题讨论】:

  • 您是否尝试将整个语句放在一个字符串中并使用ExecuteSqlCommand 运行它?
  • @Nick.McDermaid 我一定会试试的。
  • “不起作用”对我不起作用。你得到一个错误还是没有达到你的预期?我不知道它是否真的有效。这对我来说很有意义。

标签: sql-server linq entity-framework-6


【解决方案1】:

我将创建一个 SQL Server 存储过程,以获取员工 ID 作为参数。我们称它为“sp_deleteEmployees”,参数为@ids

然后在 C# 中你在 ids 上创建一个字符串

string idsList = "3, 4, 6, 7, 14, 17, 20, 21, 22"
context.Database.ExecuteSqlCommand("usp_CreateAuthor @ids={0} ", idsList);

编辑

抱歉,我想我没有理解问题所在。如果您需要删除分块的员工,您可以使用此拆分员工列表

public static List<IEnumerable<T>> Partition<T>(this IEnumerable<T> source, int length)
{
    var count = source.Count();
    var numberOfPartitions = count / length + ( count % length > 0 ? 1 : 0);

    List<IEnumerable<T>> result= new List<IEnumerable<T>>();

    for (int i = 0; i < numberOfPartitions; i++)
    {
        result.Add(source.Skip(length*i).Take(length));
    }

    return result;
}

您可以使用此方法将列表拆分为小块并一次删除一个块

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 2011-07-16
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多