如何使用linq执行右连接外连接
问题描述:
我有两组数据:trainedOfficers
和officersToTrain
。这些数据集共用一个ClubId
。我试图确保trainedOfficers
不会出现在officersToTrain
中,所以我想执行正确的外连接。综观这一形象:如何使用linq执行右连接外连接
- 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不是,你可以关闭那个场。
完全同意最后一段。这是一个糟糕的设计。 –