简体   繁体   中英

C# LINQ translation for a SQL query with RIGHT JOIN

I've got a query in ACCESS and i have to translate this query in C# LINQ.

SELECT DETAIL.*, 
       "" AS DBC_ART, 
       A_ENS.ENS_CODE, 
       A_LEA.LEA_ART, 
       A_ART_1.ART_CHA, 
       A_ART_1.ART_ANA, 
       A_ANA_REPART.ANA_CLA2 
FROM (
       (A_LEA RIGHT JOIN 
        ((DETAIL LEFT JOIN A_ART ON DETAIL.DFA_ART = A_ART.ART_CODE)
         LEFT JOIN A_ENS ON DETAIL.DFA_ART = A_ENS.ENS_CODE) ON A_LEA.LEA_ENS = A_ENS.ENS_CODE) 
         LEFT JOIN A_ART AS A_ART_1 ON A_LEA.LEA_ART = A_ART_1.ART_CODE) 
         LEFT JOIN A_ANA_REPART ON A_ART_1.ART_ANA = A_ANA_REPART.ANA_CODE 
WHERE (((A_ENS.ENS_CODE) Is Not Null) AND ((A_ART.ART_CODE) Is Null)) 
ORDER BY DETAIL.BCI, DETAIL.FACTURE;

I don't need exactly the detail fields as it's detail.* in the query (I'll found the necessary by myself)

It's for the multiple JOIN that i don't know how to translate them. I've got object lists for each 5 tables

IE

Detail -> LstDetail

A_ART -> LstA_ART

A_ENS -> LstA_ENS

A_LEA -> LstA_LEA

A_ART_1 -> LstA_ART (A_ART1 is an alias for another join than with A_ART)

A_ANAREPART -> LstA_ANAREPART

So I begin to write something like :

MyList = (from itemDetail in LstDetail 
          join itemART in LstART 
            on itemDetail.DFA_ART equals itemART.ART_CODE 
          join itemANA_REPART in LstANA_REPART 
            on itemART.ART_ANA equals itemANA_REPART.ANA_CODE 
          select (...)).ToList();

But I don't know how to handle the right join in the query. Should I make multiple linq queries? What kind?

Thanks in advance for answers

Something like this might translate, you may need to adjust case as I've used all lower case. Additionally you need to choose how to deal with detail.* , either replace the d... with a comma separated list of fields from detail d.field1, d.field2 or something like detail = d to allow the detail record to be included as an object.

var query = from d in detail
join a1 in a_art on d.dfa_art equals a1.art_code into art
from a in art.DefaultIfEmpty()
join ae1 in a_ens on d.dfa_art equals ae1.ens_code into ens
from ae in ens.DefaultIfEmpty()
join al1 in a_lea on ae.ens_code equals al1.lea_ens into lea
from al in lea.DefaultIfEmpty()
join a2 in a_art on al.art_code equals a2.lea_art into art1
from a1 in art1.DefaultIfEmpty()
join ar1 in a_ana_repart on a1.art_ana equals ar1.ana_code into ana
from ar in ana.DefaultIfEmpty()
where (ae.ens_code != null && a.art_code == null)
select new {
    d...,
    ae.ens_code,
    al.lea_art,
    a1.art_cha,
    a1.art_ana,
    ar.ana_cla2
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM