最近开始对本网站的Blog模块进行"大手术"改动,其中包括一些以下功能:
1) SEO优化
2) 分页支持
3) TagClouds功能
4) 可自定义URL显示
等等,相信修改完之后会给大家一个惊喜,原来DNN也可以如此利用 :)
废话少说,切入正题,在此无非想分享一下最近研究分页算法的心得,也就是发现一个比较有意思的算法,也许不是最优的,也不是最好,当然也不推荐使用,但是在此列举一下以博各位一哂:
- CREATE PROCEDURE {databaseOwner}[{objectQualifier}Radiant_ListEntriesByPortal]
- @PortalID int,
- @MaxEntries int = 10,
- @CurrentPage int = 1
- AS
- SELECT TOP(@MaxEntries * @CurrentPage)
- U.[UserID],
- U.[Username],
- U.[FirstName] + ' ' + U.[LastName] AS UserFullName,
- E.[EntryID] as ItemID,
- E.[BlogID],
- E.[Title],
- E.[Description],
- E.[Entry],
- E.[AddedDate],
- E.[Published],
- E.[Copyright],
- E.[PermaLink],
- IsNull(E.[AllowComments],B.[AllowComments]) As AllowComments,
- B.[ParentBlogID],
- B.[AllowAnonymous],
- B.[Syndicated] AS BlogSyndicated,
- B.[Public] AS BlogPublic,
- (Select Count(*) FROM {databaseOwner}[{objectQualifier}Blog_Comments] WHERE EntryID = E.EntryID AND (Approved = 1)) As CommentCount
- INTO #topentries
- FROM {databaseOwner}[{objectQualifier}Blog_Blogs] B INNER JOIN
- {databaseOwner}[{objectQualifier}Blog_Entries] E ON B.[BlogID] = E.[BlogID] INNER JOIN
- {databaseOwner}[{objectQualifier}Users] U ON B.[UserID] = U.[UserID]
- WHERE B.PortalID = @PortalID
- AND (E.[Published] = 1)
- AND (B.[Public] = 1)
- ORDER BY E.AddedDate DESC
-
- SELECT * FROM
- (SELECT TOP(@MaxEntries) *
- FROM #topentries
- ORDER BY AddedDate ASC) a
- ORDER BY AddedDate DESC
- GO
简单解析:仔细看看,这是一个很直观,很简单的策略算法,一开始按照所在页数取得数据条目,比如当前页CurrentPage是3,那么我们需要取出来的数据条目则为@MaxEntries * @CurrentPage = 3 × 10 = 30(假设传入的参数显示数目上限是10),然后根据添加时间顺序筛选出前10条记录,最后再倒序回来,如此这般则可以获取到第3页的数据记录,并按照添加时间更新排列的(最靠近现在的记录在最前边)。其实这一算法的所谓精髓就是后一截,也就是先顺序再倒序获取到符合需求的结果集。有兴趣者不妨琢磨琢磨,应该不难明白。
最后推荐这一算法的来源,那就是dnn核心blog的扩展模块BlogDisplay(
下载地址),它可定制显示blog在别的页面显示,可算是一个不错的模块,如果你有这方面的需要不妨看看:
Configurable Blog list view for the DotNetNuke core Blog module