2011-02-04 5 views
3

나는 두 개의 테이블, LP_task 테이블과 lp_Update 테이블을 가지고 있습니다. 특정 날짜 범위 동안 게시 된 작업의 전체 목록과 업데이트 만 필요합니다. LINQ는 다른 조인 기준을 지원하는 것처럼 보이지 않지만 각 작업과 '동일'합니다. 업데이트가없는 경우에도 모든 작업 (왼쪽 표)을 원합니다. (왼쪽 외부 조인)LINQ Left Outer Join (오른쪽 테이블의 날짜 범위 제한 있음)?

Dim TasksData = (From t In db.LP_Tasks _    
      Group Join up In db.LP_Updates On t.ID Equals up.TaskID Into upds = Group _ 
      From u In upds.DefaultIfEmpty _ 
      Order By t.TaskOrder, t.TaskNote, u.DateCreated Descending _ 
      Select New With {t.ID, t.TaskNote, u.UpdateNote, u.DateCreated}) 

이것은 모든 LP_tasks와 해당 LP_updates를 잡는 데 유용합니다. 사용 가능한 업데이트가 없으면 작업을 반환합니다 (왼쪽 외부 조인)

이제 특정 날짜 범위의 업데이트로 업데이트를 제한하려고합니다. 업데이트를 포함했지만 날짜 요구 사항을 충족하지 못하는 모든 작업을 왼쪽에서 제거하지 않고이 작업을 수행하는 방법을 알 수 없습니다. 어떤 WHERE 절도 upds.DefaultIfEmpty 후에 추가합니다. 여기에서 무엇을해야할지 모르겠습니다.

답변

1

조인에 중첩 쿼리를 사용할 수 있습니다. 그래서 필터링 된 테이블에 가입 할 수 있습니다.

// broken up for readability 
var tenYearsAgo = DateTime.Now.AddYears(-10); 
var filtered = db.LP_Updates.Where(up => up.DateCreated > tenYearsAgo); 
var query = from t in db.LP_Tasks 
      join up in filtered on t.ID equals up.TaskID into upds 
      from u in upds.DefaultIfEmpty() 
      orderby t.TaskOrder, t.TaskNote, u.DateCreated descending 
      select new { t.ID, t.TaskNote, u.UpdateNote, u.DateCreated }; 

을 그리고 VB 동등한 : 다음은 C#으로 같은 쿼리를 작성할 수있는 방법

Dim tenYearsAgo = DateTime.Now.AddYears(-10) 
Dim filtered = db.LP_Updates.Where(Function(up) up.DateCreated > tenYearsAgo) 
Dim query = From t In db.LP_Tasks            _ 
      Group Join up In filtered On t.ID Equals up.TaskID Into upds = Group _ 
      From u In upds.DefaultIfEmpty          _ 
      Order By t.TaskOrder, t.TaskNote, u.DateCreated Descending   _ 
      Select t.ID, t.TaskNote, u.UpdateNote, u.DateCreated 
+0

완료 형! 나는 LINQ의 핵심 기능 중 하나를 무시한다는 어리 석을 느낀다. 또한 람다 표현 형식을 보여 주셔서 감사합니다, 나는 VB.NET에서 사람들을 너무 많이 보지 않습니다. – TheDPQ