CSHTML中按PlayerId执行GroupBy时IGrouping无Player定义报错如何解决
问题原因
调用GroupBy(x => x.PlayerId)后返回的每个遍历对象是IGrouping<int, Stat>类型,本质是同一个PlayerId下所有Stat数据的集合,并非单个Stat实例,Player、Team以及各数据字段都是Stat类的属性,直接对分组集合访问这些属性自然会抛出找不到成员的报错。
解决方案
你需要的是按球员分组汇总各数据的合计值,修改视图中的循环逻辑即可:分组后先取分组内第一条Stat记录读取球员、球队信息(同一PlayerId对应的球员、球队信息完全一致),再对分组内所有Stat的数值字段做聚合求和。
修改后的视图循环代码如下:
@foreach (var group in Model.GroupBy(x => x.PlayerId)) { // 取分组内第一条记录读取关联的球员、球队信息 var statSample = group.First(); <tr> <td width="10%">@statSample.Player.FirstName @statSample.Player.LastName</td> <td width="10%">@statSample.Team.TeamName</td> <td width="10%">@group.Sum(s => s.Points)</td> <td width="10%">@group.Sum(s => s.Rebounds)</td> <td width="10%">@group.Sum(s => s.Assists)</td> <td width="10%">@group.Sum(s => s.Steals)</td> <td width="10%">@group.Sum(s => s.Blocks)</td> </tr> }
性能优化建议
你当前控制器中是先查询所有Stat记录,再循环查询每条记录关联的Player、Team,会产生大量额外的数据库请求,可直接用EF Core的Include方法一次性预加载关联数据,修改控制器中对应查询逻辑即可:
// 以TotStats方法为例,Index方法同理 public IActionResult TotStats() { IEnumerable<Stat> objList = _db.Stats .Include(s => s.Player) .Include(s => s.Team) .ToList(); return View(objList); }
内容的提问来源于stack exchange,提问作者Rahtz
相关产品推荐
相关产品推荐

