Linq如何以块的形式运行查询

时间:2017-01-02 06:49:22

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

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

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上创建一个锁,所以我决定在chunk中执行查询,所以我找到了下面的代码: -

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中运行此块查询代码的方式是什么?

1 个答案:

答案 0 :(得分:1)

我会创建一个SQL Server存储过程,将员工ID作为参数。我们用param @ids

称它为'sp_deleteEmployees'

然后在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;
}

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