我有與asp.net 2.0網站相同的問題,沒有「延遲加載」的解決方案。爲了對數據集進行分頁,我使用了2個sprocs,它將幫助我在每個選擇中都包裝分頁功能。
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
關於術語,我傾向於使用「分頁」來描述您需要的功能; 「延遲加載」我已經習慣於描述更復雜的對象圖/模型的部分初始加載,接下來是根據需要按需加載圖的其他部分。 [我沒有這方面的參考,所以它可能只是我...] – richaux 2011-04-07 13:01:56
順便說一句,避免DataSets就像避免'bool'或'int'。一個DataSet就是它 - 數據庫數據的一個精心編寫的,100%可靠的通用內存中表示,它在很多不同情況下都非常有用。然而,公平地說,我絕對不會將它們用於高流量的網站。 – MusiGenesis 2011-04-07 13:04:30
我一直使用Lazy Loading來表示「直到我真正需要它時才執行此操作」,但作爲我的經理所說的要求是「延遲加載」,所以我在這裏使用了:)關於DataSets I同意,但我認爲有更好的解決方案,有幾個情況下DataSet是比替代方案更好的選擇。 – 2011-04-07 13:05:38