2010-05-10 6 views
6

나는 company_id, company_name 및 기타 세부 사항을 보유한 테이블 회사가 있습니다. company.company_id에 매핑되는 company_id 열이있는 테이블 하도급 계약이 있습니다.Linq2Sql에서이 쿼리를 작성하는 방법

활성 외주 계약에 할당되지 않은 모든 활성 회사를 얻으려면 어떻게 선택 문을 작성할 수 있습니까? 즉, COMPANY_ID는

이 ****** 편집 *****

내가 올바른 SQL이 생각 subcontracts.company_id에서 찾을 수 없습니다 : 당신이 얼마나

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 작성합니다 LEFT OUTER 조인 c를 회사의 SELECT COMPANY_ID을 하청 SC는 = 1 AND sc.active_status은 sc.company_id가 null 1 c.company_id = sc.company_id 및 c.active_status입니다 = ON WHERE – Nick

답변

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 일 평가판 기간이 제공됩니다. 나는 그것이 매우 유용하다는 것을 알았다.

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

`

1

는 어쩌면처럼, NOT IN WHERE을하려고하는 것 같은데 , 이론적으로는 이것이 효과가있다.

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)); 
0

내가 그것을 테스트하지 않은 것이 아니라 SQL에 LINQ 쿼리를 변환하는 데 실패 할 수 있습니다

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

+0

@RememberME 내가 생각하는대로 편집했습니다. 또한 비활성 상태의 하도급 업체가있는 회사를 반환합니다. – Nick

+0

가입 할 필요가 없습니다. LINQ to SQL은 where 절의 하위 선택을 완벽하게 처리 할 수 ​​있습니다. –

관련 문제