2010-05-10 12 views
6

में कैसे लिखें इस तालिका में एक कंपनी है जो company_id, company_name और अन्य विवरण रखती है। मेरे पास एक टेबल सबकंट्रैक्ट्स है जिसमें एक कंपनी_आईडी कॉलम है जो company.company_id पर नक्शा करता है।इस क्वेरी को LINQ2Sql

सभी सक्रिय कंपनियों को प्राप्त करने के लिए एक चयन कथन कैसे लिख सकता हूं जिन्हें सक्रिय उपखंड में असाइन नहीं किया गया है? आईई company_id subcontracts.company_id में नहीं पाया जा सकता

****** संपादित *****

मेरा मानना ​​है कि सही एसक्यूएल है:

select company_id 
from company 
where company.active_status = 1 
and not exists(select * from subcontracts 
       where subcontracts.company = company.company_id 
       AND subcontracts.active_status = 1 
      ) 
+0

मैं की तरह एसक्यूएल लिखते थे: कंपनी से चयन company_id ग वाम बाहरी शामिल हों subcontracts अनुसूचित जाति पर c.company_id = sc.company_id और c.active_status = 1 और sc.active_status = 1 sc.company_id रिक्त है जहां – Nick

उत्तर

2

उप-चयन LINQ में काफी समान है।

var noSubs = from company in context.Companies 
      where company.active_status == 1 && 
       !(from subcontract in context.Subcontracts 
        where subcontract.active_status == 1 
        select subcontract.company_id).Contains(company.company_id) 
      select company; 

लिंक से एसक्यूएल उपखंड सामग्री पर "मौजूद नहीं है" के रूप में इसका अनुवाद करेगा।

1

चित्रा बाहर आप कैसे करना होगा यह मानक एसक्यूएल में और फिर Linqer (http://www.sqltolinq.com/) की एक प्रति उठाओ। यह उत्पाद लगभग किसी भी SQL कथन को LINQ क्वेरी में परिवर्तित करेगा। यह मुफ़्त नहीं है, लेकिन महंगा नहीं है, और 30 दिन की परीक्षण अवधि के साथ आता है। मैंने इसे बेहद उपयोगी पाया है।

1

लगता है कि आपने शायद पसंद नहीं में एक कहां करना है, कोशिश कर रहे हैं:

var companiesWithoutSubcontracts = 
     from noSub in Companies 
     where !(from withSub in Companies 
       select withSub.company_id) 
       .Contains(noSub.company_id) 
     select noSub; 

`

0

मैं इसे परीक्षण नहीं किया है और यह अच्छी तरह से हो सकता है कि LINQ एसक्यूएल के लिए क्वेरी का अनुवाद करने में विफल रहता , लेकिन सिद्धांत में यह काम करना चाहिए।

var result = context 
    .Subcontracts 
    .Select(subcontract => new 
     { 
     Subcontract = subcontract, 
     NotAssignedCompanies = context 
      .Companies 
      .Where(company => !company.Subcontracts.Contains(subcontract)) 
     }); 

यह सभी उप-अनुबंधों के लिए सभी निर्दिष्ट कंपनियों को वापस नहीं करेगा। यदि आपको केवल एक विशिष्ट उपखंड के लिए जानकारी की आवश्यकता है, तो निम्न क्वेरी पर्याप्त होगी।

var notAssignedCompanies = context 
    .Companies 
    .Where(company => !company.Subcontracts.Contains(specificSubcontract)); 
1

यह काम करना चाहिए:

var noContracts = 
    from c in db.Companies 
    join sc in db.Subcontracts.Where(sc => sc.active_status == 1) on c.company_id equals sc.company_id into compGroup 
    from cg in compGroup.DefaultIfEmpty() 
    where cg.company_id == null 
    select c; 

यह एक LEFT OUTER JOIN करता है। किसी भी company_id के बिना सभी उप-अनुबंधों को company_id के लिए NULL मान असाइन किया जाएगा, जिसे वह तब चुनता है।

+0

धन्यवाद। मैं इसे प्राप्त कर सकता हूं जहां यह सक्रिय_स्टैटस == 1 वाली कंपनियों का चयन कर रहा है जो subcontracts.company_id में नहीं हैं। लेकिन, मुझे लगता है कि यह काम करने के लिए प्रतीत नहीं होता है जहां यह केवल सक्रिय_स्टैटस == के साथ उप-संक्रमों से मेल खाता है। मैं कहां शामिल हो सकता हूं? – RememberME

+0

@RememberME जो मुझे लगता है वह करने के लिए संपादित किया गया। यह उप-संविदाओं वाली कंपनियों को भी वापस कर देगा जो – Nick

+0

निष्क्रिय हैं, आपको वास्तव में शामिल होने की आवश्यकता नहीं है। LINQ से SQL, जहां खंड में उप-चयन को संभालने में पूरी तरह से सक्षम है। –

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