2013-01-13 11 views
5

Ho due entità Candidate e CandidateLocation dove un Candidato può avere più voci CandidateLocation.Linq Navigation Proprietà complesso in cui ID in (selezionare ID da ...)

Una CandidateLocation contiene CandidateId, un codice paese ISO (ad esempio Stati Uniti, GB) e una colonna di tipo (1 = Autorizzato, 2 = Limitato).

Le regole dettano che se il Candidato non ha alcuna voce "Permesso" nella tabella CandidateLocation possono lavorare ovunque. Se hanno una posizione "Permessa" esplicita, possono lavorare solo nelle posizioni esplicitamente consentite. Non possono lavorare in luoghi soggetti a restrizioni in modo esplicito.

Per provare un dimostrare questo si prega di vedere l'immagine qui sotto (i candidati possono avere più sedi che ho tenuto a uno per semplificare l'illustrazione)

Rules

In SQL Un modo per ottenere questo sarebbe il query seguente

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

Se qualcuno sa come raggiungere questo obiettivo utilizzando LINQ & proprietà di navigazione io apprezzo molto l'aiuto.

Molte grazie

+0

Che cosa avete fino ad ora? [Cosa hai provato?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – istepaniuk

risposta

6

Supponendo che hai uno-a-molti tra i candidati e 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

semplicemente geniale, ha funzionato esattamente come la query sql. Stavo cercando di usare Contains e non riuscivo a farcela. –