我有一些删除查询,如下所示: -
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中运行此块查询代码的方式是什么?
答案 0 :(得分:1)
我会创建一个SQL Server存储过程,将员工ID作为参数。我们用param @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;
}
您可以使用此方法将列表拆分为小块并一次删除一个块