2017-01-02 4 views
0

у меня есть пачка на удаление запросов, как следующее: -Linq Как выполнять запросы в куски

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' 

SO в моем коде, я запустить этот список запросов, как показано ниже: -

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?

Каким образом я могу запустить этот код запроса chunk в Linq?

+0

ли Вы, попробуйте просто поместить весь этот оператор в строку и запустить с помощью 'ExecuteSqlCommand'? –

+0

@ Nick.McDermaid Я обязательно попробую это. – Anup

+0

«не работает» не работает для меня. Вы получаете сообщение об ошибке или не делаете то, что ожидаете? Я понятия не имею, работает ли это на самом деле. Мне просто кажется, что так будет. –

ответ

1

Я бы создал хранимую процедуру SQL Server, которая получает идентификаторы employee как параметр. Давайте назовем это «sp_deleteEmployees» с парами @ids

Затем в C# создать строку на идентификаторах

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

EDIT

К сожалению, я предполагаю, что я не понимаю эту проблемы. Если вам необходимо удалить сотрудник в куске вы можете разделить список работника с этим

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; 
} 

Вы можете использовать этот метод, чтобы разделить список на мелкие куски и удалить их один кусок за один раз

+0

Эта вещь работает. но не решила мою актуальную проблему. Но я задаю другой вопрос. – Anup

+0

извините, я думаю, я didint понимаю проблему. –

+0

Вот новый вопрос - http://stackoverflow.com/questions/41436449/linq-how-to-prevent-locks-when-bulk-delete – Anup

Смежные вопросы