2013-06-17 16 views
34

Mam to zapytanie w SQL i chcę go zaimplementować w LINQ przy użyciu Entity Framework, ale jak mogę zastosować wiele tabel lewe sprzężenia zewnętrzne?LINQ do SQL wielu tabel lewe zewnętrzne sprzężenie

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 

Odpowiedz

59

Oto jak implementuje się lewe sprzężenia zewnętrzne z LINQ. Należy użyć GroupJoin (join...into składnię):

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 

Ta kwerenda łączy trzy tabele. Możesz dołączyć do pozostałych stołów w ten sam sposób.

+0

jak poradzić sobie z datą? @lazyberezovsky –

+0

@EhsanSajjad mile widziane :) Właśnie testowałem zapytanie i znalazłem jeden problem - po zakończeniu łączenia zewnętrznego niektóre wartości 'p, m' mogą mieć wartość null. Jest OK dla prostego wyboru, ale kiedy robisz grupowanie, możesz zobaczyć coś takiego jak "null nie może być przypisane do Int32". A więc oto sposób obejścia problemu - przy wyborze anonimowego obiektu należy "prno = p == null"? 0: p.prno'. To zadziała –

+0

@ EhsanSajjad, aby poradzić sobie z korzystaniem z daty użycia [metoda EntityFunctions.TruncateTime] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.truncatetime.aspx) –

Powiązane problemy