嵌套foreach循环转LINQ后输出为IEnumerable<BPAddress>,求解决方案
问题分析与解决办法
你的原嵌套循环是遍历每个BPAddress下的BPPhones,筛选出号码长度超过11的电话;但当前的LINQ语句是筛选存在符合条件电话的BPAddress对象,所以返回IEnumerable<BPAddress>,和预期不符。
正确的LINQ写法(按预期场景选择)
场景1:只想获取所有符合条件的BPPhone对象
用SelectMany扁平化嵌套集合,再做筛选:
var k37 = Target.BPAddresss.SelectMany(x => x.BPPhones) .Where(y => y.PHON_NUMB.Length > 11);
返回结果为IEnumerable<BPPhone>,就是所有号码长度超11的电话实例。
场景2:需要同时获取符合条件的电话及其所属的BPAddress
用SelectMany的重载版本,同时投影地址和电话信息:
var k37 = Target.BPAddresss.SelectMany( address => address.BPPhones.Where(phone => phone.PHON_NUMB.Length > 11), (address, phone) => new { 所属地址 = address, 符合条件的电话 = phone } );
返回结果是包含地址和对应电话的匿名类型集合,也可以替换成你自定义的实体类型。
原LINQ的问题所在
原代码里的Target.BPAddresss.Where(...)是对BPAddress集合做筛选,判断每个地址是否存在符合条件的电话,最终返回的是满足条件的地址对象,而非电话对象,这就是结果不符合预期的核心原因。
内容的提问来源于stack exchange,提问作者Adil Asif
相关产品推荐
相关产品推荐

