如何基于LoginDate字段筛选获取最近三周内未登录的用户?
解决方法
核心逻辑:你需要先按用户维度聚合所有登录记录,取每个用户的最近一次登录时间,再判断该时间是否早于三周前,即可筛选出符合要求的用户。
修正后代码
var threeWeeksAgo = DateTime.Now.Date.AddDays(-21); var noLoginUsers = lowUsers.UserLogins // 关联客户表获取用户维度信息 .Join(lowUsers.Clients, ul => ul.client, c => c.companyName, (ul, c) => new { ClientId = c.clientID, LoginDate = ul.dateTimeCreated, CompanyName = c.companyName }) // 按用户唯一标识分组,这里用ClientId+CompanyName,可根据实际业务调整分组键 .GroupBy(a => new { a.ClientId, a.CompanyName }) // 取每个用户的最近一次登录时间 .Select(g => new { g.Key.ClientId, g.Key.CompanyName, LastLoginDate = g.Max(x => x.LoginDate) }) // 筛选最近一次登录早于三周前的用户 .Where(u => u.LastLoginDate <= threeWeeksAgo) .ToList();
逻辑说明
- 分组是核心步骤:通过
GroupBy将同一个用户的所有登录记录聚合为一组,调用Max方法取该组最大的LoginDate,也就是用户最近一次的登录时间 - 仅当用户的最近一次登录时间都早于三周前,才说明该用户近三周完全没有登录行为
以你提供的测试数据为例,假设当前日期为2021-10-05,三周前为2021-09-14:
- User1的最近登录时间为2021-10-04,晚于2021-09-14,不会被筛选
- User2的最近登录时间为2021-09-03,早于2021-09-14,会被纳入结果,符合需求
注意事项
- 如果需要包含从未有过登录记录的用户,需要调整关联逻辑:先从Clients表取全量客户,再左关联登录日志,对左关联后LoginDate为null的用户也纳入结果即可
- 建议统一使用UTC时间计算,避免服务器时区和业务时区不一致导致的统计误差
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

