如何在不同DbContext的查询结果中按CampaignId执行关联
基于CampaignId关联两个DbContext查询结果的方法
由于两个查询结果已经通过ToList()加载到内存中,直接使用LINQ to Objects即可完成关联操作,以下是两种常用的关联实现方式:
1. 内连接(仅保留双方匹配的记录)
内连接会筛选出两个集合中CampaignId完全匹配的记录,示例代码如下:
var joinedResult = InsertionId .Join( camapignId, // 待关联的第二个集合 insertion => insertion.CampaignId, // 第一个集合的关联键 lineitem => lineitem.CampaignId, // 第二个集合的关联键 (insertion, lineitem) => new { // 按需组合需要返回的字段 InsertionOrderId = insertion.Id, insertion.KiteDealId, insertion.KiteCampaignId, LineitemId = lineitem.Id, MatchedCampaignId = insertion.CampaignId } ) .ToList();
2. 左外连接(保留第一个集合的所有记录)
如果需要保留InsertionId中的全部记录,即使KiteLineitems中没有对应CampaignId的匹配项,可使用左外连接:
var leftJoinedResult = InsertionId .GroupJoin( camapignId, insertion => insertion.CampaignId, lineitem => lineitem.CampaignId, (insertion, lineitems) => new { insertion, lineitems } ) .SelectMany( x => x.lineitems.DefaultIfEmpty(), (x, lineitem) => new { InsertionOrderId = x.insertion.Id, x.insertion.KiteDealId, x.insertion.KiteCampaignId, LineitemId = lineitem?.Id, // 无匹配时返回null MatchedCampaignId = x.insertion.CampaignId } ) .ToList();
额外提示
- 你的第二个集合变量名
camapignId存在拼写错误,建议修正为campaignLineitems这类更清晰的命名,提升代码可读性。 - 若两个集合数据量极大,内存关联可能存在性能瓶颈,这种场景下可考虑将其中一个数据集写入临时表,再通过数据库层面完成关联。
内容的提问来源于stack exchange,提问作者Sarvjeet Kaur
相关产品推荐
相关产品推荐

