ASP.Net Core 如何在博客详情页按创建日期获取上下篇博文
博客详情页上下篇功能实现方案
现有代码的常见问题
- 命名逻辑和通用定义偏差:你当前的博客列表是按
CreatedDate倒序排列(最新的内容在前),常规的上下篇定义通常是:- 上一篇:比当前博客创建时间更晚(更新)的第一条内容
- 下一篇:比当前博客创建时间更早(更旧)的第一条内容
你现有代码里previousBlog取创建时间更小的、nextBlog取创建时间更大的,刚好和通用定义相反,需要先对齐业务需求,避免展示反了。
- 性能问题:现有逻辑是先加载全量启用的博客到内存,再筛选上下篇,当博客总量较大时,会产生不必要的内存占用和数据库查询开销,完全可以把筛选逻辑下推到数据库层,只返回需要的2条数据。
优化实现方案
1. 小数据量场景(博客总量<1000条)
如果不想改动现有内存查询的逻辑,只需要调整排序和取值逻辑即可:
// 现有按创建日期倒序的全量列表 blogsByDate // 上一篇(更新的内容):找创建时间大于当前值的,倒序列表里的第一个元素就是最接近当前时间的 var previousBlog = blogsByDate.FirstOrDefault(p => p.CreatedDate > blog.CreatedDate); // 下一篇(更旧的内容):找创建时间小于当前值的,倒序列表里的第一个元素就是最接近当前时间的 var nextBlog = blogsByDate.FirstOrDefault(p => p.CreatedDate < blog.CreatedDate);
注意:如果用First的话,找不到匹配项会抛异常,建议换成FirstOrDefault做空值兼容。
2. 大数据量场景(推荐)
直接在数据库层完成筛选,只查询需要的上下篇数据,性能最优:
// 查上一篇:比当前博客创建时间更晚的,取最接近当前时间的第一条 var previousBlog = await _db.Blog .Include(p => p.Sitemap) .Where(p => p.Enabled && p.CreatedDate > blog.CreatedDate) .OrderBy(p => p.CreatedDate) // 升序排列,最小的大于当前时间的就是最近的新文 .ThenBy(p => p.Id) // 加Id兜底,避免同创建时间的取值错乱 .FirstOrDefaultAsync(); // 查下一篇:比当前博客创建时间更早的,取最接近当前时间的第一条 var nextBlog = await _db.Blog .Include(p => p.Sitemap) .Where(p => p.Enabled && p.CreatedDate < blog.CreatedDate) .OrderByDescending(p => p.CreatedDate) // 降序排列,最大的小于当前时间的就是最近的旧文 .ThenByDescending(p => p.Id) // 加Id兜底 .FirstOrDefaultAsync();
边界场景处理
- 如果当前博客是全站最新的,
previousBlog会返回空,前端需要显示对应空状态(比如「暂无更新的上一篇内容」) - 如果当前博客是全站最早发布的,
nextBlog会返回空,前端做对应空态处理即可。
页面效果参考

内容的提问来源于stack exchange,提问作者ofcskn
相关产品推荐
相关产品推荐

