Register  |  Login

不一样的分页算法

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.
Popular tags: 分页算法, 模块开发
Previous Entry: DNN Skin旅程之琐碎杂想
Next Entry: 如何在DNN创建类IGoogle效果的模块

Comments

Was it good for you, too? Join the discussion »

leave a reply

About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
网站主页
dnnsun
最新评论
  1. Re: (转载)掌握JavaScript语言的思想前提

    Thanks for your comment, actually we are planning to own our english blog later.

    --baldwin

  2. Re: (转载)掌握JavaScript语言的思想前提

    This seems exciting but I wish it were in English

    --Joey

  3. Re: 加速DNN的新举措

    SkinPath是类Skin的一个自读属性, 你直接在模块里是没法用的,需要你初始化:)

    --baldwin

  4. Re: 加速DNN的新举措

    为什么我的模块里用SkinPath,找不到SkinPath的定义?

    --xmen

  5. Re: 读书杂感--开源与我

    支持一下楼主。说的很好!

    --qilei

  6. Re: 如何在DNN模块级别以编程方式添加样式文件

    reports 模块主要是用于展示自定义的SQL语句获取的数据, 你可以定义不同的SQL及其相关参数, 至于详细的用法不妨Google一下, 貌似国外有不少关于这一模块的资源:)

    --baldwin

  7. Re: 如何在DNN模块级别以编程方式添加样式文件

    请问楼主 DNN 4.5.3 reports 模块怎么使用啊?

    --DNN菜鸟

  8. Re: 如何在DNN模块级别以编程方式添加样式文件

    恩 谢谢楼主 呵呵

    --DNN菜鸟

Blog搜索
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
相册库
更多照片请查看相册库
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...
版权声明
本站任何言论仅代表个人观点,与作者所在的公司没有任何关系,所有贴子皆以“现状”提供且没有任何担保,同时也没有授予任何权利。