2011-05-26 12 views
14

में मेरे पास तीन टेबल हैं। उनमें से दो समान रूप से शामिल होते हैं लेकिन एक को बाईं ओर शामिल होने की आवश्यकता होगी। मुझे linq में ऐसा करने के लिए बहुत सारे कोड मिल रहे हैं लेकिन केवल दो टेबल के बीच।तीन तालिकाओं में शामिल होना और बाएं बाहरी का उपयोग करना

यहां SQL कोड है जिसे मैं LINQ के भीतर फिर से कोड करने का प्रयास कर रहा हूं।

SELECT PRSN.NAME 
     ,CO.NAME 
     ,PROD.NAME 
    FROM PERSON PRSN 
    INNER JOIN COMPANY CO ON PRSN.PERSON_ID = CO.PERSON_ID 
    LEFT OUTER JOIN PRODUCT PROD ON PROD.PERSON_ID = PROD.PERSON_ID; 

यहां LINQ कोड का एक स्निपेट है जिसे मैं आधार के रूप में उपयोग कर रहा हूं। मैं LINQ के माध्यम से और बाएं बाहरी जुड़ने के साथ तीसरी तालिका (मेरे नमूना एसक्यूएल में उत्पाद) को एकसाथ टुकड़ा करने में सक्षम नहीं हूं। नमूना दो तालिकाओं के बीच है। किसी भी सुझाव के लिए धन्यवाद।

var leftOuterJoinQuery = 
    from category in categories 
    join prod in products on category.ID equals prod.CategoryID into prodGroup 
    from item in prodGroup.DefaultIfEmpty(new Product{Name = String.Empty, CategoryID = 0}) 
     select new { CatName = category.Name, ProdName = item.Name }; 

माइकल

उत्तर

34

कैसे इस बारे में:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = x.NAME }) 

संपादित करें: यदि आप एक बाएं बाहरी करना सभी टेबल पर शामिल करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

var loj = (from prsn in db.People 
      join co in db.Companies on prsn.Person_ID equals co.Person_ID into comps 
      from y in comps.DefaultIfEmpty() 
      join prod in db.Products on prsn.Person_ID equals prod.Person_ID into prods 
      from x in prods.DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = y.NAME, Product = x.NAME }) 
+0

... बहुत बहुत धन्यवाद! यह मेरे लिए काम कर रहा है। – MdeVera

+1

कोई चिंता नहीं, दोस्त। मुझे हाल ही में एक ही समस्या थी ... इसे समझने में थोड़ी देर लग गई। साझा करने में प्रसन्नता :) – Beno

+0

@ बेनो आप क्या करते हैं यदि आप प्रत्येक तालिका पर बाएं बाहरी जुड़ने का उपयोग करना चाहते हैं तो एक आंतरिक और एक बाहरी शामिल हो? – mko

5

कहीं और स्टैक ओवरफ्लो थ्रेड से लिया गया, ऐसा करने के लिए एक और सुगम तरीका है:

var loj = (from prsn in db.People 
      from co in db.Companies.Where(co => co.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      from prod in db.Products.Where(prod => prod.Person_ID == prsn.Person_ID).DefaultIfEmpty() 
      select new { Person = prsn.NAME, Company = co.NAME, Product = prod.NAME }) 

यह सबसे अच्छा परिणाम (मुझे विश्वास है) के लिए linq क्वेरी सिंटैक्स और लैम्ब्डा सिंटैक्स के मिश्रण का उपयोग करता है। पहचानकर्ताओं का कोई प्रतिलिपि पुन: अलियासिंग नहीं है, और यह मैंने देखा है यह करने का सबसे संक्षिप्त तरीका है।

संबंधित मुद्दे