C# 如何使用linq执行右连接外部连接

C# 如何使用linq执行右连接外部连接,c#,linq,outer-join,right-join,C#,Linq,Outer Join,Right Join,我有两组数据:trainedOffices和OfficesToTrain。这些数据集共享一个ClubId。我正在尝试确保trainedOfficers不会出现在OfficesToTrain中,因此我希望执行右外部联接。看看这张图片: A=受过培训的官员 B=公务员培训 我尝试过执行以下查询,但没有结果 public void SetTrainedClubOfficers(ILookup<ClubID, ClubOfficerAuthority> clubsAuthorityLo

我有两组数据:
trainedOffices
OfficesToTrain
。这些数据集共享一个
ClubId
。我正在尝试确保
trainedOfficers
不会出现在
OfficesToTrain
中,因此我希望执行右外部联接。看看这张图片:

  • A=受过培训的官员
  • B=公务员培训
我尝试过执行以下查询,但没有结果

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 ClubAuthorityLookup)
{
var clubIds=clubauthoritylookup.Select(x=>x.Key);
var trainedOfficers=GetTrainedClubOfficers(clubIds.ToArray());
var CLUBSTORAIN=来自培训办事处中的培训办事处
加入ClubAuthorityLookup中的官员
接受培训的官员。钥匙等于官员。钥匙进入
来自joined.DefaultIfEmpty()中的官员
选择新的
{
ClubId=警官,钥匙,
军官=军官。选择(俱乐部=>俱乐部)
};
}
如何获得正确的外部联接?

公共void SetTrainedClubOfficers(ILookup ClubAuthorityLookup)
    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)
                               };
}
{ var clubIds=clubauthoritylookup.Select(x=>x.Key); var trainedOfficers=GetTrainedClubOfficers(clubIds.ToArray()); var CLUBSTORAIN=来自培训办事处中的培训办事处 加入ClubAuthorityLookup中的官员 接受培训的官员。钥匙等于官员。钥匙进入 来自joined.DefaultIfEmpty()中的j 选择新的 { ClubId=j.Key, 军官=军官。选择(俱乐部=>俱乐部) }; }
这是没有测试,但我认为它应该工作。你不止一次使用过警官

编辑:
不知道为什么你需要两张桌子。你可以在警官表中有一个标记为“已训练”的字段。然后,为了显示谁受过训练,你可以只键入一个字段。

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