2010-05-10 12 views
6

Ho una società di tabelle che contiene company_id, company_name e altri dettagli. Ho una tabella di contratti in subappalto che ha una colonna company_id che si associa a company.company_id.Come scrivere questa query in Linq2Sql

Come posso scrivere un'istruzione select per ottenere tutte le società attive che non sono state assegnate a un subappalto attivo? IE Il company_id non può essere trovato in subcontracts.company_id

****** ***** EDIT

credo che lo sql corretta è:

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

vorrei scrivere il codice SQL come: SELEZIONA company_id Da Company c LEFT OUTER JOIN subappalti sc ON c.company_id = sc.company_id E c.active_status = 1, sc.active_status = 1 DOVE sc.company_id è null – Nick

risposta

2

La selezione secondaria è praticamente la stessa in 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; 

Linq a SQL lo tradurrà come "non esiste" nella tabella del subappalto.

1

capire come si farebbe questo in SQL standard e quindi prendi una copia di Linqer (http://www.sqltolinq.com/). Questo prodotto convertirà quasi tutte le istruzioni SQL in una query LINQ. Non è gratuito, ma non è costoso e viene fornito con un periodo di prova di 30 giorni. Ho trovato estremamente utile.

1

Suona come si sta cercando di fare un WHERE NOT IN, come forse:

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

`

0

non ho testato e può ben darsi che LINQ to SQL non riesce a tradurre la query , ma in teoria dovrebbe funzionare.

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

Ciò restituirà tutte le società non assegnate per tutti i subappalti. Se sono necessarie solo le informazioni per un subappalto specifico, la seguente query sarà sufficiente.

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

Questo dovrebbe funzionare:

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; 

Questo fa un LEFT OUTER JOIN. A tutti i subappalti senza un company_id corrispondente verrà assegnato un valore NULL per company_id, che verrà quindi selezionato.

+0

Grazie. Posso ottenerlo dove seleziona aziende con active_status == 1 che non sono in subcontracts.company_id. Ma, non riesco a farlo funzionare in modo che corrisponda solo ai subappalti con active_status == 1. Dove inserisco il dove nel join? – RememberME

+0

@RememberME Modificato per fare ciò che penso che tu voglia. Ciò restituirà anche le aziende con subappalti inattivi – Nick

+0

Non è davvero necessario il join. LINQ to SQL è perfettamente in grado di gestire una sottoselezione nella clausola where. –