2013-01-13 2 views
5

У меня есть два сущности Кандидат и кандидат, где кандидат может иметь несколько записей кандидата.Linq Navigation Properties complex, где ID в (select id from ...)

КандидатЗадание содержит Кандидат, код страны ISO (например, США, 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-запрос. Я пытался использовать Содержит, и я просто ничего не мог понять. –

Смежные вопросы