如何在Linq2Sql中编写此查询
我有一个表公司,它包含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
)
该子选择在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会将其转换为转包表上的“不存在”。
弄清楚你会怎么做?这在标准的SQL,然后拿起Linqer副本(http://www.sqltolinq.com/)。该产品将几乎任何SQL语句转换为LINQ查询。它不是免费的,但也不贵,并且有30天的试用期。我发现它非常有用。
听起来像是你正在尝试做一个WHERE NOT IN,如可能:
var companiesWithoutSubcontracts =
from noSub in Companies
where !(from withSub in Companies
select withSub.company_id)
.Contains(noSub.company_id)
select noSub;
`
我没有测试它,它很可能是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));
这应该工作:
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,然后它会选择。
谢谢。我可以在选择不在subcontracts.company_id中的具有active_status == 1的公司的地方获得它。但是,我似乎无法让它工作,它只匹配具有active_status == 1的转包合同。我在哪里将连接位置放在连接中? – RememberME 2010-05-10 21:20:53
@RememberME编辑做我认为你想要的。这也将返回那些处于非活动状态的分包合同的公司 – Nick 2010-05-10 21:36:40
您并不需要加入。 LINQ to SQL完全能够处理where子句中的子选择。 – 2010-05-10 22:00:34
我会写像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