Register  |  
About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

不一样的分页算法

Posted in [DNN使用及思考], [DNN模块开发], [杂项] By baldwin

最近开始对本网站的Blog模块进行"大手术"改动,其中包括一些以下功能:
1) SEO优化
2) 分页支持
3) TagClouds功能
4) 可自定义URL显示
等等,相信修改完之后会给大家一个惊喜,原来DNN也可以如此利用 :)
废话少说,切入正题,在此无非想分享一下最近研究分页算法的心得,也就是发现一个比较有意思的算法,也许不是最优的,也不是最好,当然也不推荐使用,但是在此列举一下以博各位一哂:
 
  1. CREATE PROCEDURE {databaseOwner}[{objectQualifier}Radiant_ListEntriesByPortal]   
  2.     @PortalID int,   
  3.     @MaxEntries int = 10,   
  4.     @CurrentPage int = 1   
  5. AS  
  6.     SELECT TOP(@MaxEntries * @CurrentPage)   
  7.         U.[UserID],   
  8.         U.[Username],   
  9.         U.[FirstName] + ' ' + U.[LastName] AS UserFullName,   
  10.         E.[EntryID] as ItemID,   
  11.         E.[BlogID],    
  12.         E.[Title],   
  13.         E.[Description],   
  14.         E.[Entry],   
  15.         E.[AddedDate],   
  16.         E.[Published],   
  17.         E.[Copyright],   
  18.         E.[PermaLink],   
  19.         IsNull(E.[AllowComments],B.[AllowComments]) As AllowComments,   
  20.         B.[ParentBlogID],   
  21.         B.[AllowAnonymous],   
  22.         B.[Syndicated] AS BlogSyndicated,   
  23.         B.[PublicAS BlogPublic,   
  24.         (Select Count(*) FROM {databaseOwner}[{objectQualifier}Blog_Comments] WHERE EntryID = E.EntryID AND (Approved = 1)) As CommentCount   
  25.     INTO #topentries   
  26.     FROM   {databaseOwner}[{objectQualifier}Blog_Blogs] B INNER JOIN  
  27.         {databaseOwner}[{objectQualifier}Blog_Entries] E ON B.[BlogID] = E.[BlogID] INNER JOIN  
  28.         {databaseOwner}[{objectQualifier}Users] U ON B.[UserID] = U.[UserID]   
  29.     WHERE B.PortalID = @PortalID   
  30.     AND (E.[Published] = 1)   
  31.     AND (B.[Public] = 1)   
  32.     ORDER BY E.AddedDate DESC  
  33.        
  34. SELECT * FROM  
  35.     (SELECT TOP(@MaxEntries) *   
  36.     FROM #topentries   
  37.     ORDER BY AddedDate ASC) a   
  38.     ORDER BY AddedDate DESC  
  39. 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

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.