2010-05-10 19 views
6

Ich habe eine Tabelle Firma, die die Firmen-ID, Firmenname und andere Details enthält. Ich habe eine Tabelle Subunternehmer, die eine company_id Spalte hat, die company.company_id zugeordnet ist.Wie schreibe ich diese Abfrage in Linq2Sql

Wie kann ich eine Select-Anweisung schreiben, um alle aktiven Firmen zu erhalten, die keinem aktiven Subkontrakt zugeordnet sind?

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

ich die SQL wie schreiben würde: SELECT company_id FROM Firma c LEFT OUTER JOIN Zulieferungen sc ON c.company_id = sc.company_id UND c.active_status = 1 UND sc.active_status = 1 WHERE sc.company_id ist null – Nick

Antwort

2

Die Unterauswahl ist in LINQ ziemlich identisch.

Linq to SQL übersetzt dies als "nicht vorhanden" in der Subcontract-Tabelle.

1

herauszufinden, wie würden Sie tun: IE Die company_id kann nicht in subcontracts.company_id

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

ich die richtige SQL glauben finden dies in Standard-SQL und dann eine Kopie von Linqer (http://www.sqltolinq.com/) abholen. Dieses Produkt konvertiert fast jede SQL-Anweisung in eine LINQ-Abfrage. Es ist nicht kostenlos, aber auch nicht teuer und kommt mit einer 30-tägigen Testphase. Ich habe festgestellt, dass es sehr nützlich ist.

1

Klingt wie Sie versuchen, eine WHERE NOT IN zu tun, wie vielleicht:

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

`

0

Ich habe es nicht getestet und es kann gut sein, dass LINQ to SQL nicht um die Abfrage übersetzen , aber theoretisch sollte das funktionieren.

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

Dadurch werden alle nicht zugeordneten Unternehmen für alle Unteraufträge zurück. Wenn Sie nur die Informationen für einen bestimmten Unterauftrag benötigen, ist die folgende Abfrage ausreichend.

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

sollte diese Arbeit:

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; 

Dies ist ein LEFT OUTER JOIN tut. Allen Unterverträgen ohne eine entsprechende Firmen-ID wird ein NULL-Wert für die Firmen-ID zugewiesen, den sie dann auswählt.

+0

Vielen Dank. Ich kann es bekommen, wo es Unternehmen mit active_status == 1 auswählt, die nicht in subcontracts.company_id sind. Aber ich kann es nicht zum Laufen bringen, wo es nur Subkontrakte mit active_status == 1 findet. Wo setze ich das Wo in den Join? – RememberME

+0

@RememberME Edited zu tun, was ich denke, Sie wollen. Dies wird auch Unternehmen mit Subunternehmern zurückgeben, die inaktiv sind – Nick

+0

Sie brauchen nicht wirklich den Beitritt. LINQ to SQL ist in der Lage, eine Unterauswahl in der WHERE-Klausel zu verarbeiten. –

Verwandte Themen