如何使用Linq / LAMBDA(内部和左外连接)编写此SQL查询?

时间:2014-08-06 07:35:11

标签: c# sql linq outer-join

 SELECT * FROM paquet_esc PE
    INNER JOIN depot D                     
        ON PE.id_paquet_esc = D.paquet_esc_id
    INNER JOIN fichier_esc FE              
        ON D.fichier_id = FE.id_fichier
    INNER JOIN engin EN                    
        ON FE.engin_id = EN.id_engin
    LEFT OUTER JOIN reception R                 
        ON FE.id_fichier = R.fichier_id
    LEFT OUTER JOIN traitement T                
        ON FE.id_fichier = T.fichier_id
    LEFT OUTER JOIN code_erreur_traitement CET  
        ON T.code_erreur_id = CET.id_code_erreur
    LEFT OUTER JOIN integration I               
        ON FE.id_fichier = I.fichier_id
    LEFT OUTER JOIN envoi EI                    
        ON FE.id_fichier = EI.fichier_id 

2 个答案:

答案 0 :(得分:0)

也许是这样的:

var result= (
        from PE in db.paquet_esc
        join D in db.depot
            on PE.id_paquet_esc equals D.paquet_esc_id
        join FE in db.fichier_esc
            on D.fichier_id equals FE.id_fichier
        join EN in db.engin 
            on FE.engin_id equals EN.id_engin
        from R in db.reception
            .Where(w=>FE.id_fichier == w.fichier_id).DefaultIfEmpty()
        from T in db.traitement
            .Where(w=>FE.id_fichier == w.fichier_id).DefaultIfEmpty()
        from CET in db.code_erreur_traitement
            .Where(w=>T.code_erreur_id == w.id_code_erreur).DefaultIfEmpty()
        from I in db.integration
            .Where(w=>FE.id_fichier == w.fichier_id).DefaultIfEmpty()
        from EI in db.envoi
            .Where(w=>FE.id_fichier == w.fichier_id).DefaultIfEmpty()
        select new
        {
            PE.id_paquet_esc,
            D.paquet_esc_id,
            D.fichier_id
            /*And some other columns*/
        }
    ).ToList();

其中db是linq数据上下文

答案 1 :(得分:0)

这是您的内部联接和左联接的演示:

var q= from PE in paquet_esc 
       join D in depot on PE.id_paquet_esc equals D.paquet_esc_id
       join FE in fichier_esc on  D.fichier_id equals  FE.id_fichier
       join EN in engin on FE.engin_id equals EN.id_engin
       join R in reception ON FE.id_fichier equals R.fichier_id into lg1
       from R in lg1.DefaultIfEmpty()
       join T in traitement ON FE.id_fichier equals T.fichier_id into lg2
       from T in lg2.DefaultIfEmpty()
       /*bala bala bala */ 
       select PE;