LINQ嵌套筛选时SelectMany返回子对象,如何调整以返回Parent对象
你可以通过Where配合嵌套Any方法实现需求,Any用来判断嵌套集合中是否存在符合条件的元素,返回布尔值正好匹配Where的入参要求。
方案1:仅筛选符合条件的Parent对象
如果只需要获取满足后代筛选规则的Parent集合,不需要过滤Parent关联的子/孙级集合内容,直接使用以下查询即可:
var someQuery = context.Parents .Where(p => p.SomeChildren .Any(c => c.SomeGrandchildren .Any(r => r.Type == "Type 1") ) );
方案2:筛选Parent同时过滤关联的子/孙级集合
如果需要在返回Parent的同时,只保留其下符合规则的SomeChildren和SomeGrandchildren,需要额外加投影处理:
var someQuery = context.Parents // 先筛选出存在符合条件后代的Parent .Where(p => p.SomeChildren .Any(c => c.SomeGrandchildren .Any(r => r.Type == "Type 1") ) ) // 投影仅保留符合条件的嵌套集合 .Select(p => new Parent { // 赋值Parent自身的所有需要的属性 Id = p.Id, // 其他属性... SomeChildren = p.SomeChildren .Where(c => c.SomeGrandchildren.Any(r => r.Type == "Type 1")) .Select(c => new SomeChild { // 赋值SomeChild自身的所有需要的属性 Id = c.Id, // 其他属性... SomeGrandchildren = c.SomeGrandchildren.Where(r => r.Type == "Type 1").ToList() }).ToList() });
原问题报错原因
你之前直接替换Select为Where报错,是因为Where的入参要求返回布尔值来标识当前元素是否符合筛选规则,而你原来Select的返回值是嵌套集合类型,和Where的参数要求不匹配,所以会报语法错误。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

