如何用LINQ筛选Type为A的员工并按Category分组映射到NewModel?
如何用LINQ筛选指定类型员工、按Category分组并转换为NewModel集合?
嘿,这需求不难,咱们用LINQ几步就能搞定!先理清楚核心逻辑:我们要先把所有部门里Type为"A"的员工捞出来,然后按部门的Category把这些员工归到一起,最后转成NewModel类型的集合。
直接上完整代码示例(假设你已经有了List<Dept>类型的数据源depts):
// 假设这是你的部门数据源 List<Dept> depts = GetYourDeptData(); var newModelList = depts // 第一步:把每个部门里符合条件的员工拆出来,同时带上所属部门的Category .SelectMany(dept => dept.Employees .Where(emp => emp.Type == "A") // 筛选Type为"A"的员工 .Select(emp => new { dept.Category, emp.Name })) // 第二步:按Category分组,把同类别下的员工归到一组 .GroupBy(item => item.Category) // 第三步:把每组数据转换成NewModel对象 .Select(group => new NewModel { Category = group.Key, // 分组的key就是Category EmpNames = group.Select(item => item.Name).ToList() // 收集组内所有员工姓名 }) .ToList();
我给你拆解下每一步的作用:
- SelectMany:这个方法是关键,它能把每个部门里的符合条件的员工“平铺”成单独的条目,同时带上部门的Category,这样我们就得到了一堆
{ Category, Name }的小对象,方便后续分组。 - Where筛选:这一步很直白,就是把Type不是"A"的员工排除掉。
- GroupBy:把所有条目按Category归类,同一个Category的员工会被分到同一个组里——哪怕他们来自不同的部门,这正好符合需求里“按Category分组”的要求。
- Select转NewModel:最后把每个分组转换成
NewModel,分组的Key就是Category,再把组里的所有员工姓名收集成列表赋值给EmpNames。
额外注意事项
- 如果你的数据源里可能存在空值(比如
Dept为null,或者某个部门的Employees是null),记得加上空值保护,比如把dept.Employees改成dept?.Employees,避免空引用异常。 - 如果想过滤掉没有符合条件员工的Category(也就是
EmpNames为空的NewModel),可以在最后加个过滤:.Where(model => model.EmpNames.Any())
内容的提问来源于stack exchange,提问作者Alan B
相关产品推荐
相关产品推荐

