【问题标题】:Handling paging and "lazy-loading" with DataSets?使用 DataSet 处理分页和“延迟加载”?
【发布时间】:2011-04-07 21:21:59
【问题描述】:

我的公司专门使用通过存储过程填充的原始、无类型数据集。我的任务是找到一种方法来检索非常大的结果集(分页)和获得延迟加载功能的方法(至少我认为这是延迟加载;老实说,我还在学习这些东西)所以我们不是一次拉回数万行,占用服务器资源。

我个人对 DataSet 不太熟悉,因为我尽可能避免使用它们,我宁愿在这里完全摆脱它们,但是说“更改所有内容以使用 LINQ/EF”并不是一个有效的答案,因为对管理没有商业价值(而且重做事情需要很长时间,所以这个想法会立即被否决)。

是否有一些资源可以让我使用标准的无类型数据集来获得这种相同的功能?

编辑:另外,我需要一个可以处理不使用存储过程的动态创建的 SQL 的解决方案。

【问题讨论】:

  • 就术语而言,我倾向于使用“分页”来描述您需要的功能; “延迟加载”我用来描述更复杂的对象图/模型的部分初始加载,然后根据需要按需加载图的其他部分。 [我没有这方面的参考,所以可能只是我......]
  • 顺便说一句,绝对避免 DataSets 就像避免 boolint。 DataSet 就是这样 - 一个编写良好、100% 可靠、通用的数据库数据在内存中表示,它在许多不同的情况下都非常有用。但是,公平地说,我绝对不会将它们用于高流量的网站。
  • 我一直使用延迟加载来表示“在我真正需要它之前不要执行它”,但是我的经理说的要求是“延迟加载”所以我在这里使用它: ) 关于 DataSets 我同意,但我认为有更好的解决方案,在少数情况下 DataSets 是比替代方案更好的选择。
  • “分页”一种延迟加载形式 - 通常不这么称呼它(通常称为“分页”)。

标签: c# asp.net dataset


【解决方案1】:

您需要做的就是修改存储过程以分页结果集。当然,这也意味着您必须将某些条件(例如页码等)作为参数传递。假设您使用的是 SQL Server 05 或更高版本,请查看以下内容:

http://www.codeproject.com/KB/database/PagingResults.aspx

【讨论】:

    【解决方案2】:

    您需要在存储过程中实现分页。我假设您使用的是 Sql Server,所以这里有一个链接:

    http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx

    请注意,这与 DataSet 本身无关。大概,您的代码从存储过程调用生成一个 DataSet。如果你重写你的过程来进行分页,你的代码将生成一个只包含请求页面记录的数据集。

    您可以使用原始 proc 返回的 DataSet 来实现分页,方法是缓存 DataSet 并仅将选定的行返回给客户端(或更准确地说,仅使用 DataSet 的选定行来生成客户端 HTML),但这是一个超级骗子,真的很糟糕的主意。

    【讨论】:

      【解决方案3】:

      我在使用 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
      

      【讨论】:

        【解决方案4】:

        您可以查看Value List Handler 模式,该模式旨在用于“客户需要项目列表......用于演示。列表中的项目数量未知并且在许多情况下可能相当大实例。”

        这些示例(在上面的链接和here 中)适用于 Java,但应该相当容易地转换为 asp.net。

        【讨论】:

        • 希望人们能说出他们为什么投反对票;这是不错的建议,当有更简单的方法时,我唯一能想到的就是有点复杂(请参阅其他回复),但没有理由突然投反对票。
        • -1 来自我。两个问题:1)这是C#,不是java; 2) pattern 不是实际的解决方案。如果我已经喝过咖啡,我可能不会费心投反对票。
        • 别担心,只是好奇:)
        • 我也很好奇 :) 我理解它被否决的原因;如果我发布了一个特定的 c# 示例,那确实是一个更好的答案。
        猜你喜欢
        • 2016-06-12
        • 1970-01-01
        • 2022-11-07
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多