如何用LINQ过滤包含所有选中Filter文本的父实体(C#/Blazor Server)
LINQ筛选包含所有指定标签的父实体
核心逻辑
要筛选出子实体包含所有选中过滤文本的父实体,正确思路是:先提取所有选中的过滤文本,再检查每个父实体的子实体集合是否覆盖了所有这些文本。
实现代码
// 提取选中的过滤文本集合 var selectedFilterTexts = Filters.Where(f => f.Selected).Select(f => f.Text).ToList(); // 核心筛选逻辑 var filteredParents = Parents.Where(parent => // 确保每一个选中的过滤文本,都能在当前父的子实体中找到匹配项 selectedFilterTexts.All(filterText => parent.Child.Any(child => child.Text == filterText) ) ).ToList();
逻辑说明
selectedFilterTexts.All(...):遍历每一个选中的过滤文本,要求所有文本都必须在父实体的子集合中找到对应项parent.Child.Any(...):检查当前父实体是否存在至少一个子实体的Text与当前过滤文本匹配
测试场景验证
针对你的测试数据:
- 仅选中"C#"时:
selectedFilterTexts = ["C#"],三个父实体的子集合都包含"C#",因此返回全部3个父实体。 - 选中"C#"和"Pascal"时:
selectedFilterTexts = ["C#", "Pascal"],Parent1和Parent2的子集合同时包含这两个文本,Parent3缺少"Pascal",因此仅返回Parent1和Parent2,完全符合需求。
之前方案的问题分析
- 你最初的尝试:
w.Text.Contains(z => ...)用法错误,string.Contains仅接受字符串参数,不能传入lambda表达式,逻辑完全不成立。 - 参考的方案:
i.Children.All(w => ...)逻辑倒置,它要求父实体的所有子实体Text都属于选中的过滤文本,这和你需要的"父实体包含所有过滤文本"完全相反。
内容的提问来源于stack exchange,提问作者Tobias Gustafsson
相关产品推荐
相关产品推荐

