Register  |   Login
关于本人
Baldwin's Status
Ramblings of a developer for dnn solution...
 Contact Me
随笔档案
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
This posting is provided "AS IS" with no warranties, and confers no rights.

Comments

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