2011-02-05 2 views
0

다음과 같은 작업 테이블이 있습니다. 내가 원하는 무엇테이블에서 활성 및 최근 완료 "작업"선택

PK TaskId 
     TaskName 
     Notes 
     ... 
     ... 
    FK StatusId 
     DateCompleted 

는 목록을 얻을 경우, 지난 7 일 완료 플러스 어떤 작업을 활성 작업.

현재 내가 가지고있는;

var then = DateTime.Today.AddDays(-7); 
return _db.Tasks 
    .Where(t => (t.StatusId != 1)) 
    .Union(_db.Tasks 
    .Where(t => (t.DateCompleted >= then)) 
    ); 

이 방법이 가장 현명한 방법입니까? 즉 더 나은 방법 :

건배 시

답변

0

다른 대안은 다음과 같습니다

var day = DateTime.Today.AddDays(-7); 
return _db.Tasks 
    .Where(t => t.StatusId != 1 || t.DateCompleted >= day); 

이 더 간결하지만 단일 인덱스 (StatusId 또는 DateCompleted 중 하나)를 사용할 수 있습니다. Union 기술을 사용하면 두 색인을 모두 사용할 수 있지만 겹칠 가능성이 있습니다.

솔루션을 향상 시키려면 Union() 대신 Concat()을 사용하면 중복을 제거하지 않아도됩니다. 두 세트 사이에 겹침이없는 것이 확실하다면 솔루션을 향상시킬 수 있습니다. Concat()UNION보다 빠른 UNION ALL이됩니다.

+0

둘 다 감사합니다. & Matti. 이 응용 프로그램의 속도는 정말 문제가되지 않습니다, 이것은 내보다 더 우아한 해결책입니다 :) LinqPad의 결과 SQL도 훨씬 덜 껄끄 러운입니다! –

0

자체가 OK 보인다 데이터베이스에 맞게 변경할 수 있도록 나는 처음부터 DB를 생성하고,하지만 당신은 쿼리에서 간단한 "또는"을 사용할 수 ?

_db.Tasks.Where(t => t.StatusId != -1 || t.DateCompleted >= then) 
관련 문제