博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文章的上一篇和下一篇导航 V2
阅读量:6442 次
发布时间:2019-06-23

本文共 3503 字,大约阅读时间需要 11 分钟。

Insus.NET在前段时间,曾分享过一篇是使用了用户控件实现,并拉入文章显示的页面。这样子,显示文章最基本需要去读取三次数据库获取数据,一次是获取文章信息,另两次是在用户控件被使用,是获取前一篇和下一篇的标题和ID。为了改善这个性能的问题,故产生此篇:

去除用户控件,直接在读取文章时,把上一篇的ID与标题与下一篇的ID与标题一起获取。这样一次获取,节能60%。

可以参考获取文章的存储过程:

ExpandedBlockStart.gif
usp_Article_GetByPrimaryKey
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-03-05
--
 Update date: 2012-03-17;2012-03-23
--
 Description:    Get an article by article primary key.
--
 =============================================
CREATE 
PROCEDURE 
[
dbo
].
[
usp_Article_GetByPrimaryKey
]
(
    
@ArticleId 
INT
)
AS
WITH a 
AS
(
SELECT 
[
ArticleId
],
[
ArticleTypeId
],
[
ArticleTypeName
],
[
Subject
],
[
PrevArticleId
],
--
前一篇ArticleId
[
NextArticleId
] 
--
下一篇ArticleId
FROM 
[
dbo
].
[
udf_Article
]()  
--
表函数
WHERE 
[
ArticleId
] 
= 
@ArticleId
)
SELECT a.
[
ArticleId
],a.
[
ArticleTypeId
],
[
ArticleTypeName
],a.
[
Subject
],
[
PrevArticleId
],a1.
[
Subject
] 
AS 
[
PrevSubject
]
--
把前一篇的标题列出
[
NextArticleId
],a2.
[
Subject
] 
AS 
[
NextSubject
] 
--
把下一篇的标题列出
FROM a 
LEFT 
JOIN 
[
dbo
].
[
Article
] 
AS a1 
ON (a.
[
PrevArticleId
] 
= a1.
[
ArticleId
])
LEFT 
JOIN 
[
dbo
].
[
Article
] 
AS a2 
ON (a.
[
NextArticleId
] 
= a2.
[
ArticleId
]);

 

 上面代码中,有一个表函数:

ExpandedBlockStart.gif
udf_Article
SET ANSI_NULLS 
ON
GO
SET QUOTED_IDENTIFIER 
ON
GO
--
 =============================================
--
 Author:        Insus.NET
--
 Create date: 2012-03-05
--
 Update date: 2012-03-17
--
 Description:    Article details.
--
 =============================================
CREATE 
FUNCTION 
[
dbo
].
[
udf_Article
]
()
RETURNS 
TABLE
AS
RETURN
(
    
SELECT 
[
ArticleId
],at.
[
ArticleTypeId
],
[
ArticleTypeName
],
[
Subject
],
    (
SELECT 
MAX(
[
ArticleId
]
FROM 
[
dbo
].
[
Article
] 
AS a1 
WHERE a1.
[
ArticleId
] 
< a.
[
ArticleId
]
AS 
[
PrevArticleId
],
    (
SELECT 
MIN(
[
ArticleId
]
FROM 
[
dbo
].
[
Article
] 
AS a1 
WHERE a1.
[
ArticleId
] 
> a.
[
ArticleId
]
AS 
[
NextArticleId
]    
    
FROM 
[
dbo
].
[
Article
] 
AS a    
    
LEFT 
JOIN 
[
dbo
].
[
ArticleType
] 
AS at 
ON (a.
[
ArticleTypeId
] 
= at.
[
ArticleTypeId
])
)

 

ArticleView.aspx,Repeater控件有实现OnItemDataBound事件。:

ExpandedBlockStart.gif
View Code
<
asp:Repeater 
ID
="RepeaterArticleView"
 runat
="server"
 OnItemDataBound
="RepeaterArticleView_ItemDataBound"
>
        
<
ItemTemplate
>
            
<!--
其它信息字段显示
-->
            上一篇:
<
asp:HyperLink 
ID
="HyperLinkPrev"
 runat
="server"
 Target
="_blank"
></
asp:HyperLink
>
            
<
br 
/>
            下一篇:
<
asp:HyperLink 
ID
="HyperLinkNext"
 runat
="server"
 Target
="_blank"
></
asp:HyperLink
>
        
</
ItemTemplate
>
    
</
asp:Repeater
>

 

ArticleView.aspx.vb:

ExpandedBlockStart.gif
View Code
Protected 
Sub RepeaterArticleView_ItemDataBound(sender 
As 
Object, e 
As RepeaterItemEventArgs)
        
Dim drv 
As DataRowView = 
DirectCast(e.Item.DataItem, DataRowView)
        
If e.Item.ItemType = ListItemType.Item 
OrElse e.Item.ItemType = ListItemType.AlternatingItem 
Then
            
If e.Item.FindControl(
"
HyperLinkPrev
"
IsNot 
Nothing 
Then
                
Dim prevLink 
As HyperLink = 
DirectCast(e.Item.FindControl(
"
HyperLinkPrev
"), HyperLink)
                
If 
String.IsNullOrEmpty(drv(
"
PrevArticleId
").ToString()) 
Then
                    prevLink.Text = 
"
"
                
Else
                    prevLink.Text = drv(
"
PrevSubject
")
                    prevLink.NavigateUrl = 
"
~/ArticleView.aspx?ID=
" & drv(
"
PrevArticleId
")
                
End 
If
            
End 
If
            
If e.Item.FindControl(
"
HyperLinkNext
"
IsNot 
Nothing 
Then
                
Dim nextLink 
As HyperLink = 
DirectCast(e.Item.FindControl(
"
HyperLinkNext
"), HyperLink)
                
If 
String.IsNullOrEmpty(drv(
"
NextArticleId
").ToString()) 
Then
                    nextLink.Text = 
"
"
                
Else
                    nextLink.Text = drv(
"
NextSubject
")
                    nextLink.NavigateUrl = 
"
~/ArticleView.aspx?ID=
" & drv(
"
NextArticleId
")
                
End 
If
            
End 
If
        
End 
If
    
End Sub

  

转载地址:http://ugdwo.baihongyu.com/

你可能感兴趣的文章
maven_项目的依赖、聚合、继承
查看>>
用sp_lock诊断SQL Sever的死锁问题
查看>>
支持ie的时间控件 html
查看>>
传感器简介
查看>>
[改善Java代码]非稳定排序推荐使用List
查看>>
[未完成]关于JavaScript总结
查看>>
Scala中的元组
查看>>
ThreadLocal管理Connection
查看>>
SpringMVC文件下载与JSON格式
查看>>
Lenovo SplitScreen联想分屏软件只能在联想电脑运行,如何破解
查看>>
文字旋转
查看>>
sqoop 使用
查看>>
hdu1158 dp经典题
查看>>
hdu1166 敌兵布阵 树状数组/线段树
查看>>
读书笔记之:操作系统概念(第6版)-第一部分 概述(导论,计算机系统结构,操作系统结构)...
查看>>
JavaScript阻止修改对象的三种方式
查看>>
python+ffmpeg切割视频
查看>>
DUMP
查看>>
博客园如何插入编辑代码
查看>>
使用物化视图来同步数据on prebuilt table
查看>>