排序时在 ASP.NET 2.0 中的高效自定义分页

Posted

技术标签:

【中文标题】排序时在 ASP.NET 2.0 中的高效自定义分页【英文标题】:Efficient Custom Paging in ASP.NET 2.0 while sorting 【发布时间】: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?

【问题讨论】:

【参考方案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 条,这将加快响应速度到亚秒级。在这种情况下,应该通知用户他们对数据库运行的查询过于宽泛,他们需要缩小搜索条件,因为并非所有可能的结果都是结果。

【讨论】:

以上是关于排序时在 ASP.NET 2.0 中的高效自定义分页的主要内容,如果未能解决你的问题,请参考以下文章

向导控件中的 Gridview 自定义分页在 asp.net 中无法正常工作

ASP.NET 5 MVC 6 RC1 API 中的自定义模型绑定异常

ASP.Net Ajax:如何从其DLL中向asp.net 2.0工具箱添加自定义控件

ASP.NET 2.0 自定义客户端验证在 Internet Explorer 中不起作用

从 ASP.NET Core 1.1 MVC 迁移到 2.0 后,自定义 cookie 身份验证不起作用

ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?