如何在Linq2Sql中编写此查询

时间:2010-05-10 19:52:41

标签: sql linq linq-to-sql select

我有一家表公司,其中包含company_id,company_name和其他详细信息。 我有一个表子转包,其中有一个company_id列,映射到company.company_id。

如何编写select语句以获取尚未分配给活动转包的所有活跃公司? IE无法在subcontracts.company_id

中找到company_id

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

我相信正确的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
              )

5 个答案:

答案 0 :(得分: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 :(得分:1)

弄清楚如何在标准SQL中执行此操作,然后选取Linqer(http://www.sqltolinq.com/)的副本。该产品几乎可以将任何SQL语句转换为LINQ查询。它不是免费的,但也不贵,并且有30天的试用期。我发现它非常有用。

答案 2 :(得分:1)

听起来你正试图做一个不在的地方,比如说:

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

`

答案 3 :(得分: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值,然后选择该值。

答案 4 :(得分:0)

我没有对它进行测试,很可能是LINQ to 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));