2011-11-15 5 views
5

ठीक है तो मैं कोर्स मैपिंग टेबल में मौजूद दोनों पाठ्यक्रमों को सौंपी गई सभी कंपनियों को प्राप्त करने का प्रयास कर रहा हूं।क्या कोई भी इन 3 LINQ को SQL कथन में एक में कम कर सकता है?

पाठ्यक्रम मैपिंग तालिका में 2 एफके कोर्सआईड्स हैं, जो एक ही तालिका में दो अलग-अलग पाठ्यक्रमों को इंगित करते हैं।

प्रत्येक पाठ्यक्रम में एक बंडल होता है, और कंपनियों को बंडलों को सौंपा जाता है।

मैं उन सभी कंपनियों का चयन करने की कोशिश कर रहा हूं जो दोनों पाठ्यक्रमों से दोनों बंडलों को सौंपा गया है।

मैं यह करने में सक्षम हूं (संपादित करें: स्पष्ट रूप से नहीं, या तो कोई भी इसे ठीक कर सकता है?) 3 अलग-अलग LINQ प्रश्नों का उपयोग करके, लेकिन मुझे उम्मीद है कि इसे दोनों में से एक में कम करने का एक तरीका है संक्षिप्तता और प्रदर्शन:

Bundle vegasBundle = (from cm in db.VegasToPegasusCourseMaps 
            join c in db.Courses on cm.VegasCourseID equals c.CourseID 
            join b in db.Bundles on c.BundleID equals b.BundleID 
            where cm.VPCMapID == CourseMapID 
            select b).FirstOrDefault(); 

Bundle pegasusBundle = (from cm in db.VegasToPegasusCourseMaps 
            join c in db.Courses on cm.PegasusCourseID equals c.CourseID 
            join b in db.Bundles on c.BundleID equals b.BundleID 
            where cm.VPCMapID == CourseMapID 
            select b).FirstOrDefault(); 

IQueryable<Company> companyAssigned = from cb in db.CompanyBundles 
             join c in db.Companies on cb.CompanyID equals c.CompanyID 
             where cb.BundleID == vegasBundle.BundleID || cb.BundleID == pegasusBundle.BundleID 
             select c; 

return companyAssigned.ToList(); 
+0

ऐसा लगता है कि आपकी आखिरी क्वेरी उन कंपनियों को प्राप्त होगी जो * * * बंडल के बजाय * या तो * बंडल को सौंपा गया है। – CAbbott

+0

@CAbbott मुझे लगता है कि आप सही हैं, इसे ठीक करने का कोई तरीका? – BigOmega

उत्तर

3

यहाँ अपने सरलीकृत क्वेरी है:

return (
    from cm in db.VegasToPegasusCourseMaps 
     join cv in db.Courses on cm.VegasCourseID equals cv.CourseID 
     join bv in db.Bundles on cv.BundleID equals bv.BundleID  // vegasBundle 

     join cp in db.Courses on cm.PegasusCourseID equals cp.CourseID 
     join bp in db.Bundles on cp.BundleID equals bp.BundleID  // pegasusBundle 

    from cb in db.CompanyBundles          // OR-Join must be in the where clause 
     join c in db.Companies on cb.CompanyID equals c.CompanyID 

    where cm.VPCMapID == CourseMapID 
     && (cb.BundleID == bv.BundleID || cb.BundleID == bp.BundleID) 
    select c 
    ).ToList(); 

[अपडेट]:

यहाँ qu है ery जो आपकी आवश्यकताओं से मेल खाता है। यह केवल उन कंपनियों से मेल खाएगा जो दोनों पाठ्यक्रमों से मेल खाते हैं।

return (
    from cm in db.VegasToPegasusCourseMaps 

    join cv in db.Courses on cm.VegasCourseID equals cv.CourseID 
    join bv in db.Bundles on cv.BundleID equals bv.BundleID  // vegasBundle 
    join cbv in db.CompanyBundles on bv.BundleId equals cbv.BundleId 
    join cv in db.Companies on cbv.CompanyID equals cv.CompanyID 

    join cp in db.Courses on cm.PegasusCourseID equals cp.CourseID 
    join bp in db.Bundles on cp.BundleID equals bp.BundleID  // pegasusBundle 
    join cbp in db.CompanyBundles on bp.BundleId equals cbp.BundleId 
    join cp in db.Companies on cbp.CompanyID equals cp.CompanyID 

    where cm.VPCMapID == CourseMapID 
     && cv.CompanyID == cp.CompanyID 
    select cv 
).ToList(); 

एक और बात: आप निम्नलिखित रिश्ता है के बाद से: Courses.BundleId =>Bundles.BundleId =>CompanyBundles.BundleId, आप वास्तव में CompanyBundles करने के लिए Courses में शामिल होने और छोड़ Bundles शामिल हो सकते हैं। लेकिन एसक्यूएल शायद वैसे भी करता है।

+0

वाह आप बस इस तरह से से ढेर कर सकते हैं? – BigOmega

+0

इसके अलावा, क्या आप इसे ट्वीक कर सकते हैं, इसलिए यह केवल उन कंपनियों का चयन करता है जो दो मैप किए गए पाठ्यक्रमों में से प्रत्येक को सौंपा गया है? मुझे यकीन नहीं है कि अगर आपके पास यह है या नहीं, लेकिन अगर मैं सिर्फ हमारे || को बदलता हूं एक और मुझे कोई परिणाम नहीं मिलता है, जो सही नहीं होना चाहिए। – BigOmega

+0

LINQ जादू है! हां, आप 'से' (क्रॉस-जॉइन में परिणाम) को ढेर कर सकते हैं, आप कहीं भी 'कहीं भी' डाल सकते हैं! –

2

यहाँ एक संशोधन है अपने पिछले क्वेरी सुनिश्चित करने के लिए है कि आप कंपनियों है कि दोनों बंडलों में नामांकित हैं मिलती है: प्रश्नों के संयोजन के लिए

IQueryable<Company> companyAssigned = 
    from c in db.Companies 
    join vcb in db.CompanyBundles on c.CompanyID equals vcb.CompanyID 
    join pcb in db.CompanyBundles on c.CompanyID equals pcb.CompanyID 
    where vcb.BundleID == vegasBundle.BundleID && pcb.BundleID == pegasusBundle.BundleID 
    select c; 

, आप Scott Rippey के जवाब देख सकते हैं।