2010-05-10 87 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