如何查询MemberData表中每个成员对应的最快时间单条记录
你可以通过按成员分组后取每组最快记录的逻辑实现需求,调整后的代码如下:
public async Task<IActionResult> IndexFastestTimes() { var fastesttimes = await _context.MemberData .Where(x => x.Time.Minutes > 0) .GroupBy(x => x.Name) // 此处Name为存储成员名称的字段,可替换为你实际使用的字段名 .Select(g => g.OrderBy(x => x.Time).First()) .OrderBy(x => x.Time) .ToListAsync(); return View(fastesttimes); }
逻辑说明
- 保留原有
Where过滤逻辑,仅保留有效时间的记录 - 调用
GroupBy按成员维度分组,将同一个成员的所有成绩归到同一组 - 对每个成员的分组按时间升序排序后取第一条,即为该成员的最快成绩
- 最后对所有成员的最快成绩做全局升序排序,得到最终排名结果
兼容写法(适用于旧版本EF Core不支持GroupBy转译的场景)
如果运行时遇到EF Core无法转译查询的报错,可以先把过滤后的有效数据加载到内存再做分组处理:
public async Task<IActionResult> IndexFastestTimes() { var allValidRecords = await _context.MemberData .Where(x => x.Time.Minutes > 0) .OrderBy(x => x.Time) .ToListAsync(); var fastesttimes = allValidRecords .GroupBy(x => x.Name) .Select(g => g.First()) .OrderBy(x => x.Time) .ToList(); return View(fastesttimes); }
注意事项
如果你的业务中存在成员重名的情况,建议把GroupBy的分组键换成成员唯一ID字段(比如MemberId),避免重名导致的分组错误。
内容的提问来源于stack exchange,提问作者Tricky035
相关产品推荐
相关产品推荐

