【问题标题】:Efficient Custom Paging in ASP.NET 2.0 while sorting排序时在 ASP.NET 2.0 中的高效自定义分页
【发布时间】:2011-08-03 22:20:05
【问题描述】:

我在 ASP.NET 2.0 中有一个 Web 应用程序,我需要在其中进行分页。我的数据访问方法是从数据库调用中提取DataSet,然后将其转换为List<Foo>(其中 Foo 是我从数据库中提取的类型)并将我的GridView 绑定到它。我这样做的原因是我不想在整个应用程序中都在 DataTables 上使用字符串索引器,并且我可以通过将显示逻辑实现为我的类的属性来将显示逻辑与数据库分开。这也意味着我在 .NET 而不是 SQL 中进行排序。

那么,要实现分页,我需要将所有Foo 从数据库中拉出,对列表进行排序,然后从完整列表中取出我想要显示的内容:

List<Foo> myFoo = MyDB.GetFoos();
myFoo.Sort(new Foo.FooComparer());
List<Foo> toDisplay = new List<Foo>();
for (int i = pageIndex * pageSize; i < (pageIndex + 1) * pageSize && i < myFoo.Count; i++)
{
  toDisplay.Add(myFoo[i]);
}
//bind grid

有了足够多的元素,这就会成为延迟的来源;在我连接测试数据库的开发机器上,从数据库中拉取5000条记录时,在屏幕上绑定一个网格大约需要0.5秒。

要解决这个问题,我是否必须将所有显示逻辑移到 SQL 中,以便在那里进行排序和分页,还是有更好的方法?

另外,Linq to SQL 能解决这个问题吗?如果我通过在我的 .NET 类中实现的自定义属性进行排序,然后使用.Skip(pageIndex * pageSize).Take(pageSize),它是否会按照this question 中的说明将其转换为 SQL?

【问题讨论】:

    标签: c# asp.net-2.0 paging


    【解决方案1】:

    是的 - 我建议您将记录选择移至 SQL(排序和分页) - 在 SQL 中执行分页的经典方法是使用 CTE。我会给你一个很好的例子并更新我的答案。这里有一个很好的例子http://softscenario.blogspot.com/2007/11/sql-2005-server-side-paging-using-cte.html - 我用谷歌搜索“sql paging cte”。

    【讨论】:

      【解决方案2】:

      Linq to SQL 将使用文章中描述的 Row_Number 方法,通常它会对数据库执行高效的分页查询。

      但是,SQL 可以为您分页并且仍然具有性能的数据量存在限制。

      如果您有一个包含数百万或行的表,则分页函数需要限制查询的数据量,并随后使用 Row_Number 方法进行分页。

      假设您要分页此查询:

      Select column1, column2, column3 from table1 where column1 > 100
      

      现在假设返回 1,000,000 行。 SQL Server 仍然必须在超过一百万行的情况下运行其分页例程。这将需要几秒钟来调出初始查询的结果集。它必须对每个查询都这样做。

      为确保性能得到维持,您需要限制 SQL 将分页返回的记录数量。

      Select TOP 10000 column1, column2, column3 from table1 where column1 > 100
      

      现在,即使有 100 万条记录与查询匹配,也只会分页 10000 条,这将加快响应速度到亚秒级。在这种情况下,应该通知用户他们对数据库运行的查询过于宽泛,他们需要缩小搜索条件,因为并非所有可能的结果都是结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 2016-04-19
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多