Programming Newbie
Programming Newbie

Reputation: 1227

Inner join with multiple left outer joins

I have the following from statement that I am trying to translate into LINQ to 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

So I begin my translation like this:

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  

now from here I tried to go straight to the first left outer join. However, the compiler is telling me I need a semi-colon at the end of timeframe.

Can I still complete the other joins within var allWorkOrders or will I have to create a new one?

Upvotes: 0

Views: 506

Answers (1)

Brad Rem
Brad Rem

Reputation: 6026

The first problem you have is how you are joining the tables. You need a couple of where clauses and a different join. Also, as for the rest of your query, it should follow a pattern similar to this:

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
        //.....
    };

Upvotes: 1

Related Questions