在LINQ to SQL中INNER JOIN LEFT JOIN

时间:2012-07-11 16:31:32

标签: sql linq

如何将以下SQL查询中的INNER JOIN和LEFT JOIN转换为LINQ to SQL?谢谢!

SELECT transactions.postdate,
       transactions.clientkey    AS TransClientKey,
       transactions.type         AS TransType,
       clients.clientno,
       Isnull(clients.nostmt, 0) AS CliNoStmt,
       Isnull(aging.nostmt, 0)   AS AgeNoStmt,
       pmtchecks.*
FROM   ((pmtchecks
         INNER JOIN transactions
                 ON pmtchecks.transkey = transactions.transkey)
        INNER JOIN clients
                ON transactions.clientkey = clients.clientkey)
       LEFT JOIN aging
              ON ( transactions.clientkey = aging.clientkey )
                 AND ( pmtchecks.debtorkey = aging.debtorkey )
WHERE  ( pmtchecks.debtorkey = 36927 )
       AND ( transactions.status = 0 )
       AND ( transactions.postdate <= '31-May-2012' )
       AND ( ( transactions.postdate >= '01-May-2012' )
              OR ( clients.clientno = 'UNKNOWN' ) )
ORDER  BY pmtchecks.checkdate,
          pmtchecks.checkno 

2 个答案:

答案 0 :(得分:1)

嗨,这是一种虚拟代码,我不能说它完全正确,但想法与获得结果完全相同

var anonymousType=  (from pm in pmtchecks
        join tr in transactions
        on pm.transkey equals tr.transkey //INNERJOIN
        join cl in clients
        on tr.clientKey equals cl.clientKey
        join ag in aging 
        on pm.debtorkey equals ag.debtorKey into ljoin //Left Join
        from lj in ljoin.DefaultOrEmpty()
        where pm.debortkey==36927 && tr.status==0 && tr.postdate<="31-May-2012" && tr.postdate>="01-May-2012" //u will have to change this to date format first
        Select new {PostDate=tr.postdate, TransClientKey=tr.clientkey,TransType=tr.type,ClientNo=cl.clientno,CliNoStmt=cl.nomst ?? 0,AgeNoStmt=ag.nomst ??0,Pmtchecks=pm } //Anonymous type from this you can extract the values and fill to your custom type
       ).OrderBy(o=>o.Pmtchecks.checkdate).OrderBy(o=>o.Pmtchecks.checkno).ToList();

希望这会有所帮助。

答案 1 :(得分:1)

LINQ Query Samples

<强> EDITED

var pmtchecks = from p in urcontext.pmtchecks
                      join t in urcontext.transactions on p.transkey equals t.transkey
                      join a in urcontext.aging on t.clientkey equals a.clientkey into details
                      from d in details.Where( a => ( a.debtorkey == p.debtorkey)).DefaultIfEmpty()
                      where (p.debtorkey == 36927 && t.status == 0 && t.postdate <= '31-May-2012' 
                      && (t.postdate >= '01-May-2012' || c.clientno == 'UNKNOWN' ))
                      orderby p.checkdate, p.checkno 
                      select new
                      {
                           t.postdate,
                           t.clientkey,   
                           // TransClientKey = t.clientkey, //only works if TransClientKey is property 
                           t.type ,       
                           //TransTypet = t.type ,//property 
                           c.clientno,
                           c.nostmt,
                           //CliNoStmt =  c.nostmt ?? 0,//property 
                           a.nostmt//, 
                           //AgeNoStmt = nostmt ?? 0,//property
                           //p. ... //follow above for p columns
                       };