2012-06-08 263 views
0

我见从我试图转换为LINQ到SQL语句如下:内有多个左外连接连接

FROM mc.WORKORDER AS wo WITH (NOLOCK) 
INNER JOIN mc.WORKTASK AS wt WITH (NOLOCK) 
ON wo.wordoi = wt.wrkord_oi 
AND wo.tmplt = 0 
AND wo.ci_cnc_date IS NULL 
AND wt.ci_cnc_date IS NULL 
AND wt.clsdt_date >= CAST('1/1/' + CAST(year - 1 AS varchar) AS DateTime) 
AND wt.clsdt_date < DATEADD("mm", 1, CAST(CAST(quarter * 3 AS varchar) + '/1/' + CAST(year AS varchar) AS DateTime)) 
LEFT OUTER JOIN mc.WOLABOR AS wol WITH (NOLOCK) 
ON wt.wtskoi = wol.wt_oi 
LEFT OUTER JOIN mc.CREW AS c WITH (NOLOCK) 
ON wt.crew_oi = c.crewoi 
LEFT OUTER JOIN mc.WORKORDERTYPE AS wot WITH (NOLOCK) 
ON wt.wot_oi = wot.wotyoi 
LEFT OUTER JOIN mc.SEGMENTEDACCOUNT AS sa WITH (NOLOCK) 
ON wt.segacctref_oi = sa.sgaccoi 
LEFT OUTER JOIN mc.SEGVALUE AS sv WITH (NOLOCK) 
ON sa.segval4ref_oi = sv.sgvaloi 
LEFT OUTER JOIN mc.PRIORITY AS p WITH (NOLOCK) 
ON wo.prio_oi = p.priooi 
LEFT OUTER JOIN mc.SITE AS s WITH (NOLOCK) 
ON wo.BEparn_oi = s.siteoi 

所以我开始我的翻译是这样的:

int year = 2012, quarter = 1; 
string monthYear = "1/1"; 
DateTime closeDate = new DateTime(monthYear, (year-1)); 
DateTime timeframe = new DateTime(year, (quarter * 3), 01).AddMonths(1); 

var allWorkorders = 

(from wo in WORKORDERs 
    join wt in WORKTASKs on wo.Wordoi equals wt.Wrkord_oi && wo.Tmplt equals 0 && wo.Ci_cnc_date == null && wt.ci_cnc_date == null && 
     wt.clsdt_date >= (string)closeDate && wt.clsdt_date < timeframe 

现在从这里我试图直接进入第一个左外连接。但是,编译器告诉我在时间结束时需要分号。

我还可以在var allWorkOrders中完成其他连接,还是必须创建一个新连接?

+2

你可能会考虑到这尝试的实验[LINQPad(http://www.linqpad.net/)已经不是很有用的工具了。 –

+0

为什么麻烦翻译它呢?将它推入视图或表值UDF中,并将其显示为“IQueryable”以启用查询组合。 – bluevector

+0

@达思大陆 - LINQPad是我使用的。 –

回答

1

您遇到的第一个问题是您如何加入表格。你需要几条where条款和一个不同的join。此外,作为查询的其余部分,它应该遵循一个类似的模式:如果你的避风港

var allWorkorders = from wo in WORKORDERs 
    where wo.Tmplt == 0 && wo.Ci_cnc_date == null 
    join wt in WORKTASKs 
     on wo.Wordoi equals wt.Wrkord_oi 
    where wt.ci_cnc_date == null 
     && wt.clsdt_date >= (string)closeDate 
     && wt.clsdt_date < timeframe 
    join wol in WOLABOR 
     on wt.wtskoi equals wol.wt_oi into WOLABORGroup 
    join c in CREW 
     on wt.crew_oi equals c.crewoi into CREWGroup 
    // more outer joins here 
    //.... 
    from WOLABORItem in WOLABORGroup.DefaultIfEmpty() 
    from CREWItem in CREWGroup.DefaultIfEmtpy() 
    // more from clauses here 
    //... 
    select new 
    { 
     Something = WOLABORItem != null ? WOLBORItem.something : "none", 
     // more items 
     //..... 
    }; 
+0

谢谢你的帮助。 –