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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:18:36