2013-10-05 2 views
2

2 개의 테이블간에 다 대다 관계가 있습니다. 기능의Entity Framework 기능을 사용하여 레코드 삭제 대 DELETE stmt 직접 사용

하나는 탐색 테이블의 모든 레코드를 삭제로 구성하고이를 다시 채 웁니다. 내가 직접 발행 할 ExecuteSqlCommand를 사용할 때

foreach (var funcionario in listFuncionario) 
{ 
    int fun_id = 0; 
    if (!int.TryParse(funcionario.Trim(), out fun_id)) 
     continue; 
    var fun = db.Funcionario.Find(fun_id); 
    fun.Servicio.ToList().ForEach(s => db.Servicio.Remove(s)); 
    fun.Servicio.Clear(); 
    foreach (var servicio in listServicio) 
     fun.Servicio.Add(db.Servicio.Find(servicio)); 
} 
db.SaveChanges(); 

그 루프는, 그러나, (특별히 삭제) 매우 느린 :

는 내가 처음이의 평균으로 컬렉션을 다시 채우기 후 관련 기록을 삭제하고 의해 엔티티 프레임 워크를 사용 DELETE 및 문을 사용하면 루프가 빠릅니다.

내가 엔티티 프레임 워크와 객체 지향 프로그래밍의 본질이 손실되기 때문에 SQL 명령을 직접 실행 좋아하지 않는다. Entity Framework를 사용하여보다 효율적인 방법으로이를 수행 할 수있는 방법을 알고 계십니까? listFuncionario에서

안부, 각 ID에 대한 제이미

+1

당신은 시도 할 수 있었다'= 거짓 db.Configuration.AutoDetectChangesEnabled,'* 전 * 일반적으로 대량 작업의 같은 종류의 성능을 향상하여 외부'foreach' 루프. 'Servicio' 엔티티를 (db.Servicio.Remove (s)로하고있는) DB에서 정말로 삭제하고 싶습니까? 또는 링크 레코드 만? – Slauma

답변

1

은 별도의 쿼리 (db.Funcionario.Find)를 실행합니다. 한 번에 모든 레코드가 Funcionario이되면 속도를 높일 수 있습니다.

var funs = db.Funcionario.Where(f => idList.Contains(f.Id)); 

하지만 당신은 같은 시간에 Servicio 컬렉션을로드하여이 문제를 더 최적화 할 수 있습니다 : 먼저 ID를 구문 분석하고 List<int>에 저장할 필요의이 idList을 가정 해 봅시다 지금

var funs = db.Funcionario 
      .Include("Servicio") // Or .Include(f => f.Servicio) 
      .Where(f => idList.Contains(f.fun_id)); 

foreach(var fun in funs.ToList()) 
{ 
    fun.Servicio.ForEach(s => db.Servicio.Remove(s); 
} 

을 할 수있는 그리고 Servicio 객체를 추가 할 수 있도록 동일한 원샷 조회를 할 수있는, 그래서 마지막을 해결책은 이것이다 :

var servicio = db.Servicio.Where(s => listServicio.Contains(s.Id)).ToList(); 

var funs = db.Funcionario 
      .Include("Servicio") // Or .Include(f => f.Servicio) 
      .Where(f => idList.Contains(f.Id)); 

foreach(var fun in funs.ToList()) 
{ 
    fun.Servicio.ForEach(s => db.Servicio.Remove(s); 
    foreach(var serv in servicio) 
    { 
     fun.Servicio.Add(serv); 
    } 
} 

나는 fun.ServicioClear이 필요하지라고 생각합니다.