2013-01-13 50 views
5

我有两个实体候选人和CandidateLocation候选人可以有多个CandidateLocation条目。Linq导航属性复杂其中的ID(选择ID从...)

CandidateLocation包含CandidateId,ISO国家代码(例如US,GB)和类型列(1 =允许,2 =限制)。

规则规定,如果候选人在CandidateLocation表中没有任何“允许”条目,他们可以在任何地方工作。如果他们有明确的“允许”位置,他们只能在明确允许的位置工作。他们不能在受限制的地点工作。

要尝试的证明这一点,请参见下面的(考生可以有我一直是多个位置,以简化插图)的图像

Rules

在SQL实现,这将是一种方式下面的查询

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,我似乎无法得到任何回报。 –