如何基于UserTimes的Timestamp条件筛选IQueryable<User>中的用户?
LINQ实现用户筛选:匹配UserTimes中时间戳条件的用户
这是个很常见的关联筛选场景,我给你两种简洁高效的LINQ实现方式,都能完美满足你的需求:
方法1:使用Join+Where(适合先过滤时间记录再关联)
先对UserTimes数据集做时间筛选,再和User按UserId关联,最后去重避免重复结果:
// 替换成你的指定时间戳值 DateTime targetTimestamp = xxxx; var filteredUsers = users .Join( // 先筛选出时间戳大于指定值的UserTimes记录 userTimes.Where(ut => ut.Timestamp > targetTimestamp), user => user.UserId, userTime => userTime.UserId, (user, _) => user) // 只保留User对象 .Distinct(); // 去重:同一个用户可能有多条符合条件的时间记录
方法2:使用Any子查询(可读性更强)
直接在User的过滤条件中,判断当前用户是否存在符合时间要求的UserTimes记录,这种写法更直观,ORM会自动转换成高效的EXISTS子查询:
DateTime targetTimestamp = xxxx; var filteredUsers = users .Where(user => userTimes.Any(userTime => userTime.UserId == user.UserId && userTime.Timestamp > targetTimestamp));
补充说明
- 如果是基于EF等ORM的
IQueryable,两种方式都会被转换成优化后的SQL查询,性能差异不大; - 如果是内存中的
IEnumerable数据集,两种写法也都能正常工作,但Any的写法更简洁,无需手动去重。
内容的提问来源于stack exchange,提问作者Marvin Klein
相关产品推荐
相关产品推荐

