2011-09-16 8 views
1

성능을 위해이 linq 문을 최적화하는 데 도움이됩니다. 진행할 4000 대의 드라이버가 있으며 페이지 시간이 초과됩니다. 당신이 Any()을 사용해야 할 때 Count() > 0를 사용하는이 linq 문을 최적화하는 데 도움이

tblDriver driver = Mapper.Map<Domain.Driver, tblDriver>(driverDto); 

var entries = (from e in driver.tblDriverLogEntries 
       where e.OccuredAt <= utcEnd && 
       e.OccuredAt >= utcViolationsStart && 
       e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0 
       select e).Union(
        //previous amended status 
        (from e in driver.tblDriverLogEntries 
         where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0 
         && e.OccuredAt < utcViolationsStart 
         orderby e.OccuredAt descending 
         select e).Take(1).Union(
          //next amended status 
          (from e in driver.tblDriverLogEntries 
           where e.tblDriverStatusChanges.Where(s => !s.RemovedAt.HasValue).Count() > 0 
           && e.OccuredAt > utcEnd 
           orderby e.OccuredAt ascending 
           select e) 
          ) 
        ); 
+0

정말 하위 쿼리를 별도로 작성한 다음 끝에 결합해야합니다. 최소한 관리하기 쉬워야합니다. –

+1

무엇을 Optoimize할까요? 가독성, 성능, 메모리 사용량 또는 내가 잊어 버린 것을 잊지 않았습니까? –

+0

항상 적어도 하나의 fullfilling이 있는지 확인하십시오 : "e.OccuredAt

답변

4
where e.tblDriverStatusChanges.Where(x => !x.RemovedAt.HasValue).Count() > 0 

내가 Linq에 오히려 새로운 오전 :

where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue) 
: 이것은 당신에게 적어도 약간의 속도 향상을 줄 것이다 (귀하의 요청에 3 회 발생)

미리 정의하여이 검색어에 대한 결과를 얻을 수도 있으므로 3 번 다시 검색어를 입력하지 않아도됩니다. 예 :

var subset = (from e in driver.tblDriverLogEntries 
      where e.tblDriverStatusChanges.Any(x => !x.RemovedAt.HasValue) 
      select e).ToList(); 

var entries = (from e in subset 
       where e.OccuredAt <= utcEnd && 
       e.OccuredAt >= utcViolationsStart 
       select e).Union(
       //previous amended status 
       (from e in subset 
       where e.OccuredAt < utcViolationsStart 
       orderby e.OccuredAt descending 
       select e).Take(1).Union(
       //next amended status 
       (from e in subset 
        where e.OccuredAt > utcEnd 
        orderby e.OccuredAt ascending 
        select e))); 
+0

제안 해 주셔서 감사합니다. 나는 linq를 최적화하는 과정에 있지만 문제가 우리가 automapper를 구현하는 방법에 있을지도 모를까 걱정됩니다. – crazyDiamond

관련 문제