2013-06-17 18 views
34

私はこのクエリをSQLで実装しましたが、Entity Frameworkを使用してLINQで実装したいのですが、複数のテーブルを外部結合のまま適用するにはどうすればよいですか?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でどのように実装されるかを示します。あなたはGroupJoinjoin...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 

このクエリでは、3つのテーブルを結合します。残りのテーブルは同じ方法で結合することができます。

+0

日付の扱い方は? @lazyberezovsky –

+0

@EhsanSajjad welcome :)私はちょうどクエリをテストしていて、問題を見つけました。あなたが外部結合を残したときに、値の一部が 'p、m'になることがあります。単純な選択では問題ありませんが、グループ化しているときに '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) –

関連する問題