2016-04-07 23 views
0

ACCESS'de bir sorgum var ve bu sorguyu C# LINQ içine çevirmeliyim. o ayrıntı olarakC# LINQ çevirisi

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; 

Tam detail alanları gerekmez. * sorguda

O birden içindir

i nasıl bilmiyorum JOIN (başıma gerekli bulundu edeceğiz) çevirmek için Her 5 tablo için nesne listelerine sahibim

I.E.

Detay -> LstDetail

A_ART -> LstA_ART

A_ENS -> LstA_ENS

A_LEA -> LstA_LEA

A_ART_1 -> LstA_ART (A_ART1 ile daha katılması için başka bir takma addır A_ART)

A_ANAREPART -> LstA_ANAREPART

Yani böyle bir şey yazmaya başlamak:

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(); 

Ama hakkını işlemek sorguda katılmak için nasıl bilmiyorum. Birden çok linq sorusu yapmalı mıyım? Ne tür? Bütün küçük harf kullandım olarak böyle

+0

Başka örneklere baktınız mı? http://stackoverflow.com/questions/9914623/how-to-make-a-right-join-using-linq-to-sql-c-sharp –

+3

Sağdaki birleşim, zıt yönde sadece sol birleşimdir. Sorguyu yeniden düzenlersin, böylece hepsi bir arada kalır. Ayrıca bir sol birleştirme yapıyorsanız, 'DefaultIfEmpty()' sözdizimini kullanmanız gerekecektir, aksi halde linq onu bir iç birleştirme olarak kabul eder –

+0

@Bob Vale Sağa bir birleştirme için doğru birleştirme yoluna giden yol doğru yoldu, ama her bir ayrı ayrı devam etmek gerekiyordu çünkü her zaman bu hatayı aldım: "Nesne başvurusu bir nesnenin örneğine ayarlanmadı" (NULL değeri ile birleştirilmiş alan nedeniyle düşünüyorum). Teşekkürler. – Fabrice76

cevap

0

şey çevirmek olabilir cevaplar için şimdiden

sayesinde, davayı ayarlamak gerekebilir. Ek olarak,ile nasıl başa çıkacağınızı seçmeniz gerekir; d...'u d.field1, d.field2 alanından virgülle ayrılmış bir listeyle veya ayrıntı kaydının bir nesne olarak dahil edilmesine izin vermek için detail = d gibi bir alanla değiştirin.

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 
}; 
+0

Sağ birleştirmeyi karşılık gelen sol üyeye dönüştürdüm –

+0

Doğru cevap: Sadece nesne sonucunda önek gerekiyor: ae! = Null? ae.ens_code: string.Empty; ve diğer alanlar için ... – Fabrice76