2013-06-17 2 views
34

나는이 쿼리를 SQL로 가지고 있으며 LINQ에서 Entity Framework을 사용하여 구현하려고하지만 외부 조인을 여러 테이블 적용하는 방법은 무엇입니까?LINQ to SQL 여러 테이블 왼쪽 외부 조인

SELECT d.bookingid, 
     d.labid, 
     d.processid, 
     p.prid, 
     p.prno, 
     d.DestinationBranchID, 
     d.SendStatus 
FROM dc_tpatient_bookingd d 
     LEFT OUTER JOIN dc_tpatient_bookingm m ON d.bookingid = m.bookingid 
     LEFT OUTER JOIN dc_tpatient p ON p.prid = m.prid 
     LEFT OUTER JOIN dc_tp_test t ON d.testid = t.testid 
     LEFT OUTER JOIN dc_tp_groupm gm ON t.groupid = gm.groupid 
     LEFT OUTER JOIN dc_tpanel pn ON m.panelid = pn.panelid 
     LEFT OUTER JOIN dc_tp_organization og ON og.orgid = m.clientid 
     LEFT OUTER JOIN dc_tp_ward w ON w.wardid = m.wardid 
     LEFT OUTER JOIN dc_tp_branch tb ON tb.BranchID = m.BranchID 
WHERE d.processid = 6 
     AND ((m.branchId = 1 
       AND d.DestinationBranchID = 0) 
       OR (d.DestinationBranchID = 1 
        AND d.sendstatus = 'R')) 
     AND d.testid IN (SELECT testid 
         FROM dc_tp_test 
         WHERE subdepartmentid = 13) 
     AND date_format(m.enteredon, '%Y/%m/%d') BETWEEN '2013/06/15' AND '2013/06/15' 
GROUP BY m.bookingid 
ORDER BY d.priority DESC, 
     m.bookingid ASC 

답변

59

왼쪽 외부 조인을 LINQ로 구현하는 방법은 다음과 같습니다. 당신은 GroupJoin (join...into 구문)를 사용한다 :

from d in context.dc_tpatient_bookingd 
join bookingm in context.dc_tpatient_bookingm 
    on d.bookingid equals bookingm.bookingid into bookingmGroup 
from m in bookingmGroup.DefaultIfEmpty() 
join patient in dc_tpatient 
    on m.prid equals patient.prid into patientGroup 
from p in patientGroup.DefaultIfEmpty() 
// ... other joins here 
where d.processid == 6 && 
     ((m.branchId == 1 && d.DestinationBranchID == 0) || 
     (d.DestinationBranchID == 1 && d.sendstatus == "R")) 
// ... other conditions here 
orderby d.priority descending, m.bookingid 
select new { 
    d.bookingid, 
    d.labid, 
    d.processid, 
    p.prid, 
    p.prno, 
    m.bookingid // need for grouping 
} into x 
group x by x.bookingid into g 
select g 

이 쿼리는 세 개의 테이블을 조인. 같은 방식으로 나머지 테이블을 결합 할 수 있습니다.

+0

날짜를 처리하는 방법은 무엇입니까? @lazyberezovsky –

+0

@EhsanSajjad 환영합니다 :) 그냥 쿼리를 테스트하고 한 가지 문제를 발견했습니다. 왼쪽 외부 조인을 수행하면 일부 값'p, m'이 null 일 수 있습니다. 단순한 선택에서는 괜찮습니다. 그러나 그룹화 할 때 'null을 Int32에 할당 할 수 없습니다.'와 같은 것을 볼 수 있습니다. 그래서 해결 방법입니다 - 익명 객체를 선택할 때'prno = p == null? 0 : p.prno'. 그 트릭을 할 것입니다 –

+0

@ 데이트 일을 처리하는 @ EhsanSajjad 사용 [EntityFunctions.TruncateTime 방법] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.truncatetime.aspx) –

관련 문제