如何按指定属性分组并按另一属性排序?EF查询求助
问题分析与解决方案
我看到你的问题了——你想从Post表中获取PostGroup与ApplicationUserId的唯一属性对,按PostDate倒序排序,且只筛选自己、关注的用户或关注的站点的帖子,但当前查询的排序结果不符合预期。
问题根源
你的原查询中,orderby是在分组操作前执行的,但分组会将同一PostGroup+ApplicationUserId的所有帖子合并为一个组。此时分组后的结果并没有保留原帖子的PostDate排序逻辑,EF无法将之前的排序应用到最终的分组结果上,导致排序失效。
要解决这个问题,我们需要在分组时记录每组的最新发布日期,然后基于这个日期对分组结果进行排序。
修正后的代码
var posts = (from m in context.Posts // 先筛选符合条件的帖子:自己的、关注的用户的、关注的站点的 where m.ApplicationUserId == Id || context.FollowedUsers.Any(n => n.FollowerId == Id && n.ApplicationUserId == m.ApplicationUserId) || context.FollowedSites.Any(n => n.ApplicationUserId == Id && n.SiteId == m.SiteId) // 按目标字段分组,同时记录每组的最新PostDate group m by new { m.PostGroup, m.ApplicationUserId } into g // 先按每组的最新PostDate倒序排序 orderby g.Max(p => p.PostDate) descending // 选择需要的字段 select new { g.Key.ApplicationUserId, g.Key.PostGroup } // 分页 ).Skip(skip).Take(nOfPosts).ToList();
关键优化点
- 把
FirstOrDefault替换成Any:Any在EF中会生成更高效的EXISTS查询,比FirstOrDefault的性能更好,逻辑上也更贴合“是否存在关注关系”的判断。 - 分组时通过
g.Max(p => p.PostDate)获取每组的最新发布日期,以此作为排序依据,确保分组结果按最新帖子的日期倒序排列。 - 调整了操作顺序:先筛选,再分组,最后基于分组的最新日期排序,保证排序逻辑作用在最终的分组结果上。
内容的提问来源于stack exchange,提问作者DCodes
相关产品推荐
相关产品推荐

