You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:05