2013-06-17 8 views
34

Ich habe diese Abfrage in SQL, und ich möchte es in LINQ mit Entity Framework implementieren, aber wie kann ich mehrere Tabellen linken äußeren Joins anwenden?LINQ to SQL mehrere Tabellen linken äußeren Join

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 

Antwort

59

Hier ist, wie Links Outer Joins mit LINQ implementiert werden. Sie sollten GroupJoin (join...into Syntax) verwenden:

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 

Diese Abfrage verknüpft drei Tabellen. Sie können den Rest der Tabellen auf die gleiche Weise verbinden.

+0

Wie behandelt man das Datum? @lazyberezovsky –

+0

@EhsanSajjad willkommen :) Ich habe gerade Abfrage getestet und ein Problem gefunden - wenn Sie linken äußeren Join tun, dann können einige der Werte 'p, m' null sein. Es ist OK für die einfache Auswahl, aber wenn Sie eine Gruppierung durchführen, können Sie etwas wie "null kann Int32 nicht zugewiesen werden" sehen. Also hier ist eine Problemumgehung - wenn Sie ein anonymes Objekt auswählen, tun Sie 'prno = p == null? 0: p.prno'. Das macht den Trick –

+0

@EhsanSajjad, um Datum zu behandeln, das Gebrauch verwendet [EntityFunctions.TruncateTime Methode] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.truncatetime.aspx) –