如何修改LINQ Lambda查询获取符合条件的球队及对应SQL语句
解决LINQ统计球队球员数量并筛选的问题
你的原LINQ查询通过Join关联了Team和Player,但这样会生成每个球员对应所属球队的配对数据,不仅会返回重复的Team对象,还没法直接统计每个球队的球员总数。结合你提到的DBFirst生成的类无关联、仅通过Team.ID == Player.IDTeam匹配的情况,我给你两种可行的LINQ Lambda写法:
方法一:使用GroupJoin(更直观)
GroupJoin可以直接将每个Team和其对应的所有Player集合关联起来,方便统计数量:
teams = connection.Team .Where(t => t.ID != team.ID && t.IsVisible == true && !t.DeleteDate.HasValue) .GroupJoin(connection.Player, t => t.ID, p => p.IDTeam, (t, players) => new { Team = t, PlayerCount = players.Count() }) .Where(tp => tp.PlayerCount >= 4) .Select(tp => tp.Team) .ToList();
这个写法先筛选出符合基础条件的球队(非当前队、可见、无删除日期),再和球员表关联分组,统计每个球队的球员数,最后只保留球员数≥4的球队。
方法二:先Join再GroupBy
如果你更习惯用Join,也可以先关联后分组,再统计数量:
teams = connection.Team .Join(connection.Player, t => t.ID, p => p.IDTeam, (t, p) => new { Team = t, Player = p }) .Where(tp => tp.Team.ID != team.ID && tp.Team.IsVisible == true && !tp.Team.DeleteDate.HasValue) .GroupBy(tp => tp.Team) .Where(g => g.Count() >= 4) .Select(g => g.Key) .ToList();
这里先关联球队和球员,筛选基础条件后,按Team分组,统计每组的元素数(即球员数),最后取分组的Key(也就是Team对象)。
对应的SQL语句
实现相同逻辑的SQL可以用两种写法,效果一致:
写法一:使用子查询统计球员数
SELECT t.* FROM Team t WHERE t.ID != @CurrentTeamID AND t.IsVisible = 1 AND t.DeleteDate IS NULL AND (SELECT COUNT(*) FROM Player p WHERE p.IDTeam = t.ID) >= 4;
写法二:使用GROUP BY和HAVING
SELECT t.* FROM Team t JOIN Player p ON t.ID = p.IDTeam WHERE t.ID != @CurrentTeamID AND t.IsVisible = 1 AND t.DeleteDate IS NULL GROUP BY t.ID, t.IsVisible, t.DeleteDate -- 需包含Team表所有查询字段 HAVING COUNT(p.ID) >= 4;
注:第二种SQL写法中,GROUP BY子句需要包含SELECT中所有非聚合的Team字段,具体字段根据你的Team表结构调整。
内容的提问来源于stack exchange,提问作者Michele Boscagin
相关产品推荐
相关产品推荐

