.ToList()
으로 전화를 걸면 시작할 때 해당 엔티티를 모두 메모리로 되돌려 놓습니다. 그리고이 루핑을 통해 여러분의 상황을 이해하면 SQL 45000 번을 효과적으로 호출 할 수 있습니다.
개체를 삭제하려면 전체 개체를 반환하지 않아도됩니다. 난 단지 당신의 쿼리의 ID를 선택하여 삭제 접점의 ID를 잡아 당겨 제안 :
var ids = db.Groups.Find(id).Contacts.Select(x => x.ContactId).ToList();
내가 다음이를 처리 할 수 있도록 EntityFrameworkExtensions 라이브러리 (https://github.com/loresoft/EntityFramework.Extended) 중 하나를 실행에 보일 것이다 (최대 배치를 확인하고 삭제) 또는 DELETE FROM Contacts WHERE ContactID IN (1,2,3,....)
과 같은 IN 검색어를 사용하지만 다시 한 번 배치합니다. 코드는이 같은 것 이것이 당신이 SaveChanges()
전체 호출 할 때 즉시 실행 및되지 않습니다 그러나
m_context.Contacts.Delete(x => idList.Contains(x.ContactId));
참고 :
확장 라이브러리를 사용하면 같이 삭제 할 수 있습니다
public int RemoveContacts(IList<int> _ids)
{
int index = 0;
int numDeleted = 0;
while (index < _ids.Count())
{
var batch= _ids.Skip(index).Take(MAX_BATCH_SIZE);
//Using extensions method
numDeleted += context.Contacts.Delete(x => batch.Contains(x.ContactId));
//Using SQL
context.Database.ExecuteSqlCommand("DELETE FROM Contacts WHERE ContactID IN {0}", batch);
index += MAX_BATCH_SIZE;
}
return numDeleted ;
}
두 방법 모두 45 분이 걸립니까? –