2010-05-10 88 views
6

我有一個表公司,它包含company_id,company_name和其他詳細信息。 我有一個表格分包合同,其中有一個company_id列映射到company.company_id。如何在Linq2Sql中編寫此查詢

如何編寫select語句以獲取尚未分配到活動轉包合同的所有活動公司? IE的COMPANY_ID不能subcontracts.company_id找到

******編輯*****

我相信正確的SQL是:

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

我會寫像SQL: SELECT COMPANY_ID從C公司 LEFT OUTER JOIN分包鈧在c.company_id = sc.company_id和c.active_status = 1 AND sc.active_status = 1 WHERE sc.company_id爲空 – Nick 2010-05-10 20:33:23

回答

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; 

Linq to SQL會將其轉換爲轉包表上的「不存在」。

1

弄清楚你會怎麼做?這在標準的SQL,然後拿起Linqer副本(http://www.sqltolinq.com/)。該產品將幾乎任何SQL語句轉換爲LINQ查詢。它不是免費的,但也不貴,並且有30天的試用期。我發現它非常有用。

1

聽起來像是你正在嘗試做一個WHERE NOT IN,如可能:

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

`

0

我沒有測試它,它很可能是LINQ到SQL無法翻譯查詢,但理論上這應該起作用。

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的轉包合同都會被分配一個NULL的值給company_id,然後它會選擇。

+0

謝謝。我可以在選擇不在subcontracts.company_id中的具有active_status == 1的公司的地方獲得它。但是,我似乎無法讓它工作,它只匹配具有active_status == 1的轉包合同。我在哪裏將連接位置放在連接中? – RememberME 2010-05-10 21:20:53

+0

@RememberME編輯做我認爲你想要的。這也將返回那些處於非活動狀態的分包合同的公司 – Nick 2010-05-10 21:36:40

+0

您並不需要加入。 LINQ to SQL完全能夠處理where子句中的子選擇。 – 2010-05-10 22:00:34