C#使用LINQ如何根据条件过滤返回指定对象列表
按条件过滤嵌套分类条目的实现方案
你需要过滤的是每个外层对象下嵌套的ObjectDetails集合中category值为3的条目,而非外层对象本身,原有分支写法的问题是没有针对内层嵌套集合做过滤,因此无法生效。
最优实现(无额外分支,性能最优)
直接在构建ObjectDetails集合的逻辑末尾追加过滤条件,不需要额外写if-else分支,一次遍历即可完成构建和过滤:
var objectQuery = query .ToList() .Select(a => new { a.Id, ObjectDetails = (new ObjectClass[] { }) .Concat(/* 原有Concat逻辑保持不变 */) .Concat(/* 原有Concat逻辑保持不变 */) .Distinct() .Select(f => new { f.ObjectDetails.Id, f.ObjectDetails.Name, f.ObjectDetails.DisplayName, category = (int)f.ObjectDetails.Category, f.ObjectDetails.IsArchived, }) // 追加过滤逻辑:条件a不成立时全保留,成立时排除category=3的项 .Where(detail => !conditionA || detail.category != 3) }); // 多余的ToList()可以去掉,FirstOrDefault直接取首项即可 return objectQuery.FirstOrDefault();
过滤条件的逻辑说明:
- 当
conditionA为false时,!conditionA直接判定为真,Where条件恒成立,所有条目全部保留 - 当
conditionA为true时,执行后半段判断,仅保留category != 3的条目
兼容原有逻辑的分支写法
如果你不想修改原有查询构建的代码,可以在最终返回前对结果做二次处理,修正后的分支逻辑如下:
var result = objectQuery.FirstOrDefault(); // 结果为空直接返回 if (result == null) return null; if (conditionA) { // 条件成立时重新投影对象,过滤内层分类为3的条目 return new { result.Id, ObjectDetails = result.ObjectDetails.Where(d => d.category != 3).ToList() }; } // 条件不成立直接返回原始结果 return result;
注意事项
- 你定义匿名类时分类字段名是小写的
category,写过滤条件时要和字段名保持一致,不要写成大写开头的Category,否则会触发属性不存在的编译错误 - 不需要在
FirstOrDefault()前额外调用ToList(),会产生不必要的内存分配,影响性能
内容的提问来源于stack exchange,提问作者Quentin
相关产品推荐
相关产品推荐

