我有一家表公司,其中包含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
)
答案 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));