2013-01-13 7 views
5

Mam dwa podmioty Kandydat i Kandydat Lokalizacja, w których Kandydat może mieć wiele wpisów w Kandydacie.Linq Navigation Properties complex gdzie ID (wybierz identyfikator z ...)

Lokalizacja CandidateLocation zawiera ID kandydata, kod ISO kraju (np. US, GB) i kolumnę typu (1 = dozwolone, 2 = ograniczone).

Reguły narzucają, że jeśli Kandydat nie ma wpisów "Dozwolone" w tabeli Kandydata, może pracować w dowolnym miejscu. Jeśli mają jawną lokalizację "dozwoloną", mogą działać tylko w wyraźnie dozwolonych lokalizacjach. Nie mogą pracować w wyraźnie ograniczonych lokalizacjach.

Aby spróbować wykazać to patrz rysunek poniżej (Kandydaci mogą mieć wiele lokalizacji Ja zachowałem go do jednego celu uproszczenia ilustracji)

Rules

W SQL Jednym ze sposobów osiągnięcia tego będzie po zapytaniu

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

Jeśli ktoś wie, jak osiągnąć ten LINQ & Właściwości nawigacji Chciałbym bardzo wdzięczni za pomoc.

Dziękujemy

+0

Co masz do tej pory? [Co próbowałeś?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – istepaniuk

Odpowiedz

6

Zakładając, że masz jeden-do-wielu stowarzyszenie między kandydatami i 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

po prostu genialny, pracował dokładnie tak, jak kwerenda sql. Próbowałem używać Contains i po prostu nie mogłem tego uzyskać. –