2013-06-17 90 views
34

Tôi có truy vấn này trong SQL và tôi muốn nó thực hiện trong LINQ sử dụng Entity Framework, nhưng làm cách nào tôi có thể áp dụng nhiều bảng bên ngoài các kết nối bên ngoài?LINQ to SQL nhiều bảng bên ngoài tham gia

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 

Trả lời

59

Dưới đây là cách các kết nối bên ngoài bên trái được triển khai với LINQ. Bạn nên sử dụng cú pháp 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 

Truy vấn này tham gia ba bảng. Bạn có thể tham gia phần còn lại của bảng theo cùng một cách.

+0

cách xử lý ngày tháng? @lazyberezovsky –

+0

@EhsanSajjad welcome :) Tôi vừa thử nghiệm truy vấn và tìm thấy một vấn đề - khi bạn tham gia bên ngoài bên trái, sau đó một số giá trị 'p, m' có thể là null. Nó là OK để chọn đơn giản, nhưng khi bạn đang làm nhóm, bạn có thể thấy một cái gì đó như 'null không thể được gán cho Int32'. Vì vậy, đây là cách giải quyết - khi chọn đối tượng ẩn danh làm 'prno = p == null? 0: p.prno'. Điều đó sẽ thực hiện thủ thuật –

+0

@EhsanSajjad để xử lý việc sử dụng ngày tháng [EntityFunctions.TruncateTime Method] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.truncatetime.aspx) –