2017-09-22 2 views
-2

데이터의 두 세트가 있습니다 : trainedOfficersofficersToTrain입니다. 이 데이터 세트는 공통적으로 ClubId을 공유합니다. 이 officersToTrain에 나타나지 않도록하려면 바로 외부 조인을 수행하고 싶습니다. 이 이미지에서 상대 :linq을 사용하여 오른쪽 조인 외부 조인을 수행하는 방법

enter image description here

  • A는 = trainedOfficers
  • B = officersToTrain

나는 다음과 같은 쿼리를 수행 시도했지만 그것이 어떤 결과를 얻을 수 없습니다.

public void SetTrainedClubOfficers(ILookup<ClubID, ClubOfficerAuthority> clubsAuthorityLookup) 
{ 
    var clubIds = clubsAuthorityLookup.Select(x => x.Key); 
    var trainedOfficers = GetTrainedClubOfficers(clubIds.ToArray()); 
    var clubsToTrain = from trainedOfficer in trainedOfficers 
         join officer in clubsAuthorityLookup 
         on trainedOfficer.Key equals officer.Key into joined 
         from officer in joined.DefaultIfEmpty() 
         select new 
         { 
          ClubId = officer.Key, 
          Officers = officer.Select(club => club) 
         }; 
} 

올바른 외부 결합을 얻으려면 어떻게해야합니까?

답변

1
public void SetTrainedClubOfficers(ILookup<ClubID, ClubOfficerAuthority> clubsAuthorityLookup) 
     { 
      var clubIds = clubsAuthorityLookup.Select(x => x.Key); 
      var trainedOfficers = GetTrainedClubOfficers(clubIds.ToArray()); 
      var clubsToTrain = from trainedOfficer in trainedOfficers 
           join officer in clubsAuthorityLookup 
           on trainedOfficer.Key equals officer.Key into joined 
           from j in joined.DefaultIfEmpty() 
           select new 
           { 
            ClubId = j.Key, 
            Officers = officer.Select(club => club) 
           }; 
} 

이것은 테스트하지 않았지만 제대로 작동해야한다고 생각합니다. 장교를 한 번 이상 사용 했었습니다.

편집 : 왜 이렇게 두 개의 테이블이 필요한지 잘 모릅니다. Officers 테이블에 'IsTrained'플래그가있는 필드가있을 수 있습니다. 그런 다음 훈련받은 사람과 그렇지 않은 사람을 표시하려면 해당 필드를 키 오프하면됩니다.

+0

마지막 단락과 완전히 일치합니다. 이것은 형편없는 디자인입니다. –

관련 문제