如何使用LINQ筛选两个关联对象列表的匹配项及解决代码报错
问题分析与解决方案
你的代码报错核心原因是:外层Where需要返回bool的判断条件,但你内层用Where返回了一个集合(IEnumerable<HoldingAdviceDecision>),类型不匹配导致编译错误。
解决方案1:筛选符合条件的SellWish对象
如果只需要找出存在对应满足条件的HoldingAdviceDecision的SellWish,用Any替代内层的Where——Any会返回bool值,判断是否存在匹配项:
var matchedSellWishes = sellWishes.Where(sellWish => holdingAdviceDecisions.Any(holdingAdvice => sellWish.Id == holdingAdvice.TradeInstructionId && holdingAdvice.CustomerDecision == CustomerDecision.FollowsAdvice ) );
解决方案2:获取SellWish与对应HoldingAdviceDecision的组合
如果需要同时拿到匹配的SellWish和对应的HoldingAdviceDecision,用Join关联两个集合后再筛选:
var matchedPairs = sellWishes.Join( holdingAdviceDecisions, sellWish => sellWish.Id, // SellWish的关联字段 holdingAdvice => holdingAdvice.TradeInstructionId, // HoldingAdviceDecision的关联字段 (sellWish, holdingAdvice) => new { SellWish = sellWish, HoldingAdvice = holdingAdvice } // 组合成匿名对象 ).Where(pair => pair.HoldingAdvice.CustomerDecision == CustomerDecision.FollowsAdvice);
优化方案(大数据量场景)
如果数据量较大,为避免重复遍历holdingAdviceDecisions,可以先预处理符合条件的记录,用字典存储:
// 先筛选出符合CustomerDecision条件的记录,按TradeInstructionId建字典 var validAdviceLookup = holdingAdviceDecisions .Where(ha => ha.CustomerDecision == CustomerDecision.FollowsAdvice) .ToDictionary(ha => ha.TradeInstructionId); // 直接通过字典快速匹配SellWish var matchedSellWishes = sellWishes.Where(sw => validAdviceLookup.ContainsKey(sw.Id));
内容的提问来源于stack exchange,提问作者user7336033
相关产品推荐
相关产品推荐

