LINQ使用GroupBy和Count统计时如何将分组返回的用户ID替换为用户名
代码调整方案
核心修改点是将分组Key改为同时包含人员ID和姓名的复合键,不需要修改原有过滤逻辑,同时调整返回集合的类型支持存储姓名字段。
修改后完整代码
// 获取归属于某组织的所有列表 var lists = context.SalesToolsLists .Include(x => x.OwningUserOrganization) .Where(x => uoids.Contains(x.OwningUserOrganization.Id)) .ToList(); // 调整分组逻辑+返回结构 // 注意:这里将原有UOListCounts的类型从List<Tuple<int, int>>改为List<Tuple<int, string, int>>,三个值分别对应人员ID、人员姓名、列表数量 res.UOListCounts = new List<Tuple<int, string, int>>(); foreach (var listgroup in lists.GroupBy(info => new { UserId = info.OwningUserOrganizationId, FullName = info.OwningUserOrganization.FullName }) .Select(group => new { UserId = group.Key.UserId, UserName = group.Key.FullName, Count = group.Count() }) .OrderBy(x => x.UserId)) { res.UOListCounts.Add(new Tuple<int, string, int>(listgroup.UserId, listgroup.UserName, listgroup.Count)); }
优化建议
如果希望代码可读性更高,建议自定义DTO类代替Tuple:
// 自定义DTO类 public class UserListCountStat { public int UserId { get; set; } public string UserFullName { get; set; } public int ListCount { get; set; } } // 查询写法可以简化为: res.UOListCounts = context.SalesToolsLists .Include(x => x.OwningUserOrganization) .Where(x => uoids.Contains(x.OwningUserOrganization.Id)) .GroupBy(info => new { info.OwningUserOrganizationId, info.OwningUserOrganization.FullName }) .Select(g => new UserListCountStat { UserId = g.Key.OwningUserOrganizationId, UserFullName = g.Key.FullName, ListCount = g.Count() }) .OrderBy(x => x.UserId) .ToList();
内容的提问来源于stack exchange,提问作者Fredrik Kindahl
相关产品推荐
相关产品推荐

