5

Candidate が複数の CandidateLocation エントリを持つことができる Candidate と CandidateLocation の 2 つのエンティティがあります。

CandidateLocation には、CandidateId、ISO 国コード (US、GB など)、およびタイプ列 (1 = 許可、2 = 制限) が含まれます。

規則では、Candidate が CandidateLocation テーブルに「許可された」エントリを持っていない場合、どこでも動作できることが規定されています。明示的に「許可された」場所がある場合、明示的に許可された場所でのみ働くことができます。明示的に制限された場所では機能しません。

これをデモンストレーションするには、下の画像を参照してください (候補者は複数の場所を持つことができます。図を簡略化するために 1 つにしています)

ルール

SQL でこれを実現する 1 つの方法は、次のクエリです。

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 & Navigation Properties を使用してこれを達成する方法を誰かが知っていれば、助けていただければ幸いです。

どうもありがとう

4

1 に答える 1

6

Candidates と CandidateLocations の間に 1 対多の関連付けがあると仮定します。

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))
);
于 2013-01-13T22:06:23.573 に答える