LINQ中实现GroupBy:将球员所属球队数量统计SQL转为LINQ查询
把SQL查询转换成LINQ的解决方案
没问题,这就帮你把这段SQL转换成对应的LINQ查询~我会提供几种不同的写法,你可以根据自己的代码风格和实体配置情况选择:
先说明前提假设
假设你的EF Core(或LINQ to SQL)实体类和数据库表结构对应如下:
Player类:包含PlayerID,FirstName,LastName,EmailAddress,CellNo属性TeamPlayers类:包含ID,PlayerID,TeamID属性- 你已经有对应的数据库上下文实例(比如
dbContext)
写法一:和SQL结构最接近的查询语法
这种写法和你的原始SQL逻辑完全对应,容易理解:
var playerTeamCountQuery = from p in dbContext.Player join tp in dbContext.TeamPlayers on p.PlayerID equals tp.PlayerID // 按所有需要保留的非聚合字段分组,对应SQL的GROUP BY group tp by new { p.PlayerID, p.FirstName, p.LastName, p.EmailAddress, p.CellNo } into playerGroup select new { // 从分组键中获取球员基础信息 playerGroup.Key.FirstName, playerGroup.Key.LastName, playerGroup.Key.EmailAddress, playerGroup.Key.CellNo, // 统计分组内的球队数量,对应SQL的COUNT(TP.TeamID) TeamCount = playerGroup.Count() };
这里的group tp by new { ... }完全对应SQL里的GROUP BY子句,playerGroup.Count()等价于你SQL中的COUNT(TP.TeamID)——因为是内连接,每个分组里的TeamID都是有效的,直接统计数量即可。
写法二:方法链式语法
如果你习惯用链式调用的写法,逻辑和上面完全一致:
var playerTeamCountQuery = dbContext.Player // 执行内连接,对应SQL的JOIN子句 .Join(dbContext.TeamPlayers, p => p.PlayerID, tp => tp.PlayerID, (p, tp) => new { Player = p, TeamPlayer = tp }) // 按球员的唯一标识及基础信息分组 .GroupBy(x => new { x.Player.PlayerID, x.Player.FirstName, x.Player.LastName, x.Player.EmailAddress, x.Player.CellNo }) // 投影出需要的结果 .Select(g => new { g.Key.FirstName, g.Key.LastName, g.Key.EmailAddress, g.Key.CellNo, TeamCount = g.Count() });
写法三:利用导航属性的简洁写法(推荐)
如果你的Player实体已经配置了和TeamPlayers的导航属性(比如public ICollection<TeamPlayers> TeamPlayers { get; set; }),那可以完全不用写显式的Join,ORM会自动帮你处理关联逻辑:
// 注意:这个写法会返回所有球员(包括没有加入任何球队的,此时TeamCount为0) var playerTeamCountQuery = from p in dbContext.Player select new { p.FirstName, p.LastName, p.EmailAddress, p.CellNo, TeamCount = p.TeamPlayers.Count() }; // 如果要和你的SQL完全一致(只返回至少加入一支球队的球员),加上过滤条件即可: var playerTeamCountQuery = from p in dbContext.Player where p.TeamPlayers.Any() select new { p.FirstName, p.LastName, p.EmailAddress, p.CellNo, TeamCount = p.TeamPlayers.Count() };
这种写法更简洁易读,也是ORM推荐的使用方式~
内容的提问来源于stack exchange,提问作者Sandhya Janakiraman
相关产品推荐
相关产品推荐

