2013-01-13 2 views
5

두 개의 엔티티 Candidate 및 CandidateLocation을 가지며 여기서 후보는 여러 CandidateLocation 항목을 가질 수 있습니다.Linq Navigation Properties complex ID in (선택 ID from ...)

CandidateLocation에는 ISO 국가 코드 (예 : 미국, GB) 및 유형 열 (1 = 허용됨, 2 = 제한됨) 인 후보 ID가 있습니다.

규칙은 후보자가 CandidateLocation 테이블에 '허용 된'항목이없는 경우 어디에서나 작업 할 수 있다고 규정합니다. 명시된 '허용'위치가있는 경우 명시 적으로 허용 된 위치에서만 작업 할 수 있습니다. 그들은 제한된 장소에서 일할 수 없습니다. 는이 SQL에서

Rules

이가 될 것이라고 달성 한 가지 방법을 (후보자가 그림을 단순화하기 위해 하나에 내가 그것을 유지 한 여러 위치를 가질 수 있습니다) 아래의 이미지를 참조하시기 바랍니다 보여 시도

SELECT * 
FROM Candidate 
WHERE Candidate.IsArchived = 0 
    AND 
     -- Do not inlude restricted locations (RestrictionStatus = 2) 
     Candidate.CandidateId NOT IN (SELECT CandidateId FROM CandidateLocation WHERE IsArchived = 0 AND CountryISOCode = @Location AND RestrictionStatus = 2) 
    AND 
     (
     -- Include Explicit Permitted Locations 
     Candidate.CandidateId IN (SELECT CandidateId FROM CandidateLocation WHERE IsArchived = 0 AND CountryISOCode = @Location AND RestrictionStatus = 1) 
     OR 
     -- Include Candidates with no Explicit Permitted Locations 
     Candidate.CandidateId NOT IN (SELECT CandidateId FROM CandidateLocation WHERE IsArchived = 0 AND RestrictionStatus = 1) 
     ) 

사람이 & 탐색 속성 내가 도움을 크게 감사하겠습니다이 사용 LINQ를 달성하는 방법을 알고있는 경우 쿼리

다음과 같습니다.

많은 감사

+0

사이의 관계를 가지고 있다고 가정하면? [무엇을 시도해 봤습니까?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – istepaniuk

답변

6

당신은 일대 후보자와 CandidateLocations 당신이 지금까지해야합니까

Context.Candidates.Where(c => c.IsArchived == 0 && 
!c.CandidateLocations.Any(
    l => l.CountryISOCode == location && l.RestrictionStatus == 2) && 
(c.CandidateLocations.Any(
    l => l.CountryISOCode == location && l.RestrictionStatus == 1) || 
!c.CandidateLocations.Any(
    l => l.RestrictionStatus == 1)) 
); 
+0

그냥 똑똑하고 SQL 쿼리와 똑같이 작동합니다. 나는 Contains를 사용하려고 노력 했었고 나는 그걸 가지고 아무 것도 얻을 수 없었습니다. –