处理分页和“延迟加载”;数据集
本文关键字:延迟加载 数据集 分页 处理 | 更新日期: 2023-09-27 17:48:59
我的公司使用完全通过存储过程填充的原始的、未类型化的数据集。我的任务是找到一种方法来检索非常大的结果集(分页)和获得延迟加载功能的方法(至少我认为这是延迟加载;说实话,我还在学习这些东西,所以我们不会在一个批处理中回调数万行,占用服务器资源。
我个人不太熟悉数据集,因为我尽可能地避免它们,我宁愿在这里完全摆脱它们,但是说"改变一切以使用LINQ/EF"不会是一个有效的答案,因为没有商业价值的管理(它会花费太长时间来重做事情,所以这个想法会立即被击落)。
是否有一些资源,我可以看看得到这种相同的功能,但使用标准的非类型化数据集?
EDIT:另外,我需要一个可以使用不使用存储过程的动态创建的SQL的解决方案。
您所需要做的就是修改存储过程以对结果集进行分页。当然,这也意味着你必须传递某些标准作为参数,如页码等。假设您使用的是SQL Server 05或更新版本,请查看以下内容:
http://www.codeproject.com/KB/database/PagingResults.aspx需要在存储过程中实现分页。我假设你正在使用Sql Server,所以这里有一个链接:
http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx请注意,这与dataset 本身无关。假设,您的代码从存储过程调用生成DataSet。如果你重写你的进程来做分页,你的代码将生成一个只包含被请求页面记录的DataSet。
您可以使用原始程序返回的数据集来实现分页,通过缓存数据集并仅将选定的行返回给客户端(或者更准确地说,仅使用数据集的选定行来生成客户端HTML),但这是一个超级超级,非常糟糕的想法。
我在asp.net 2.0网站上遇到了同样的问题,没有"延迟加载"的解决方案。为了对数据集进行分页,我使用了2个进程,这将帮助我在每次选择时包装分页功能。
CREATE PROCEDURE [dbo].[Generic_Counting]
@tables VARCHAR(MAX),
@filter VARCHAR(MAX) = '1=1'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strQuery VARCHAR(8000)
SET @strQuery = ' SELECT COUNT(*) FROM '+ @tables +'
WHERE '+ @filter
execute (@strQuery)
IF @@ERROR<>0
BEGIN
--error on generic count
SET NOCOUNT OFF
RETURN 10067
END
SET NOCOUNT OFF
RETURN 0
END
GO
CREATE PROCEDURE [dbo].[Generic_Paging]
@tables VARCHAR(1000),
@pk VARCHAR(100),
@pageNumber INT = 1,
@pageSize INT = 10,
@fields VARCHAR(MAX) = '*',
@filter VARCHAR(MAX) = '1=1',
@orderBy VARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strQuery VARCHAR(8000)
DECLARE @strMinRecord VARCHAR(12);
DECLARE @strMaxRecord VARCHAR(12);
SET @strMinRecord = CONVERT(VARCHAR(12),((@pageNumber -1)*@pageSize + 1))
SET @strMaxRecord = CONVERT(VARCHAR(12), (@pageNumber * @pageSize))
-- Use ROW_NUMBER function
SET @strQuery ='
WITH Generic_CTE As
(
SELECT ''RowNumber'' = ROW_NUMBER() OVER(ORDER BY ' +
ISNULL(@orderBy,@pk) +'),' +
@fields +
' FROM ' + @tables +
' WHERE ('+ @filter +')
)
SELECT ' + @fields + '
FROM Generic_CTE
WHERE RowNumber BETWEEN ' + @strMinRecord +' AND '+ @strMaxRecord
--print @strQuery
execute (@strQuery)
IF @@ERROR<>0
BEGIN
--error on generic paging
SET NOCOUNT OFF
RETURN 10066
END
SET NOCOUNT OFF
RETURN 0
END
GO
您可以看看值列表处理程序模式,设计用于"客户端需要项列表…为演示。列表中的项目数量是未知的,在许多情况下可能相当大。"
示例(在上面的链接和这里)是针对Java的,但是应该可以很容易地转换为asp.net。