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

如何用C# LINQ方法语法关联两表并按ID分组返回多字段统计结果

问题描述

数据表结构

PractitionerSkill { Id, Title }
PractitionerInSkills { Id, PractitionerSkillId }, 其中PractitionerSkillId是关联PractitionerSkill的外键

(其余字段无关紧要)

需求目标

用C# LINQ方法语法实现如下SQL的逻辑,统计每个技能对应的从业者数量:

SELECT 
    S.Id, S.Title, COUNT(*) as [Count] from 
    PractitionerSkills S INNER JOIN 
    PractitionerInskills PIS ON S.ID = PIS.PractitionerSkillId
GROUP BY 
    S.Id, S.Title
ORDER BY
    S.Title

该SQL返回包含技能ID、技能名称及对应从业者数量的结果。

现有代码问题

目前使用LINQ查询语法编写的代码,既非方法语法,也未返回Skill.Id字段:

var query = from skill in _context.PractitionerSkills
        join pis in _context.PractitionerInSkills on skill.Id equals pis.PractitionerSkillId into grp
        select new
        {
            Title = skill.Title,
            Count = grp.Count()
        };

解决方案:LINQ方法语法实现

以下是贴合原SQL逻辑的方法语法代码,同时返回Id、Title和统计数:

var query = _context.PractitionerSkills
    // 内连接两张表,匹配关联键
    .Join(
        _context.PractitionerInSkills,
        skill => skill.Id,
        pis => pis.PractitionerSkillId,
        (skill, pis) => new { Skill = skill, PractitionerInSkill = pis }
    )
    // 按技能的Id和Title分组
    .GroupBy(
        groupedItem => new { groupedItem.Skill.Id, groupedItem.Skill.Title },
        groupedItem => groupedItem.PractitionerInSkill
    )
    // 提取分组后的结果字段
    .Select(group => new
    {
        Id = group.Key.Id,
        Title = group.Key.Title,
        Count = group.Count()
    })
    // 按技能名称排序
    .OrderBy(result => result.Title);

代码说明:

  • Join:实现两张表的内连接,指定关联字段后将匹配结果组合为匿名类型
  • GroupBy:以技能的Id和Title作为分组依据,确保分组的唯一性
  • Select:从分组结果中提取目标字段,统计每组的记录数
  • OrderBy:按技能名称排序,与原SQL逻辑完全一致

内容的提问来源于stack exchange,提问作者Ruvan Fernando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:10:01