LINQ嵌套类查询报错:无法将匹配项转换为布尔值问题咨询
嘿,我一眼就看出问题出在哪了——你的LINQ写法里,Where方法的条件写错啦!
Where方法要求你传入一个**返回布尔值(true/false)**的判断逻辑,用来筛选元素。但你现在在每一层的Where里写的是类似x.Seasons.Where(...).FirstOrDefault(),这玩意儿返回的是一个具体的对象(比如Season或者null),不是bool值。编译器尝试把这个对象转换成布尔值的时候就懵了,所以才会抛出“无法将匹配项转换为布尔值”的错误。
两种场景的正确写法
场景1:直接找到Id为"1234"的Match对象
如果你的目标是拿到最底层的那个Match,用SelectMany把嵌套集合扁平化是最直接的:
var match = community.TeamLeagues .SelectMany(x => x.Seasons) // 把所有TeamLeague下的Season拉平成一个集合 .SelectMany(y => y.Divisions) // 再把所有Season下的Division拉平 .SelectMany(z => z.Matches) // 最后把所有Division下的Match拉平 .FirstOrDefault(a => a.Id == "1234"); // 找第一个Id匹配的Match,找不到就返回null
场景2:找到包含该Match的上层TeamLeague对象
如果你需要的是包含这个Match的TeamLeague,那用Any来判断子集合里是否存在符合条件的元素就对了(Any返回bool,刚好满足筛选条件的要求):
var targetTeamLeague = community.TeamLeagues .FirstOrDefault(x => x.Seasons .Any(y => y.Divisions .Any(z => z.Matches .Any(a => a.Id == "1234"))));
简单总结
Where需要的是“这个元素是否符合要求”的判断(返回bool),不是让你直接去下层找元素。Any用来判断集合里有没有符合条件的元素,返回bool,完美适配嵌套筛选的场景。SelectMany用来把多层嵌套的集合拆成单层,方便直接遍历最底层的元素。
内容的提问来源于stack exchange,提问作者BMills
相关产品推荐
相关产品推荐

