.NET Core 2.0 Razor Pages:如何用LINQ IQueryable分组统计登录数据
没问题,我来帮你搞定这个需求!下面是具体的实现步骤和代码示例:
实现方法
首先,我们可以创建一个**视图模型(ViewModel)**来存储分组统计后的结果,这样在Razor页面中遍历展示会更清晰:
public class UserLogStats { public string UserName { get; set; } public int LogOnCount { get; set; } public DateTime LastLogOnTime { get; set; } }
接下来,在你的Razor Page后台代码(.cshtml.cs文件)中,修改OnGet()方法,用LINQ的GroupBy和聚合函数完成查询:
public IList<UserLogStats> UserLogStats { get; set; } // 假设你已经注入了DbContext实例,比如: private readonly YourDbContext _dbContext; public YourPageModel(YourDbContext dbContext) { _dbContext = dbContext; } public void OnGet() { UserLogStats = _dbContext.MyData // 按UserName字段分组 .GroupBy(u => u.UserName) // 将分组结果投影到我们的ViewModel中 .Select(g => new UserLogStats { UserName = g.Key, // 统计当前用户的登录总次数 LogOnCount = g.Count(), // 获取当前用户的最后登录时间(可选,按需保留) LastLogOnTime = g.Max(l => l.LogOn) }) // 转换为可直接遍历的List集合 .ToList(); }
代码解释:
GroupBy(u => u.UserName):把MyData数据集按照用户名分组,每个分组对应一个用户的所有登录记录。g.Count():统计每个分组内的记录数量,也就是该用户的登录次数。g.Max(l => l.LogOn):获取分组内最新的登录时间,如果不需要这个字段,直接移除相关代码即可。.ToList():将EF生成的IQueryable查询转换为List,方便在Razor页面中遍历。
在Razor页面(.cshtml)中展示结果:
你可以用foreach循环来渲染统计数据:
<table> <thead> <tr> <th>用户名</th> <th>登录次数</th> <th>最后登录时间</th> </tr> </thead> <tbody> @foreach (var stat in Model.UserLogStats) { <tr> <td>@stat.UserName</td> <td>@stat.LogOnCount</td> <td>@stat.LastLogOnTime.ToString("dd/MM/yyyy HH:mm")</td> </tr> } </tbody> </table>
注意事项:
- 确保
MyData实体类中的LogOn字段是DateTime类型,这样EF才能正确将Max等聚合函数转换为SQL语句执行。 - 如果只需要统计登录次数,不需要最后登录时间,直接删除
LastLogOnTime相关的代码即可。
内容的提问来源于stack exchange,提问作者Molenpad
相关产品推荐
相关产品推荐

