如何用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
相关产品推荐
相关产品推荐

