如何使用linq执行右连接外连接

问题描述:

我有两组数据:trainedOfficersofficersToTrain。这些数据集共用一个ClubId。我试图确保trainedOfficers不会出现在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) 
         }; 
} 

如何获得正确的外部连接?

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

这没有测试,但我认为它应该工作。你不止一次地使用过军官。

编辑: 不知道为什么你会需要两个表。你可以在军官表中标记'IsTrained'。然后为了显示谁是训练vs不是,你可以关闭那个场。

+0

完全同意最后一段。这是一个糟糕的设计。 –