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

问题描述 投票:0回答:2

我有一个 ASP.NET 2.0 中的 Web 应用程序,我需要在其中进行分页。 我的数据访问方法是从数据库调用中提取

DataSet
,然后将其转换为
List<Foo>
(其中 Foo 是我要从数据库中提取的类型)并将我的
GridView
绑定到它。 我这样做的原因是,我不想在整个应用程序中都在 DataTable 上使用字符串索引器,并且我可以通过将显示逻辑实现为类的属性来将显示逻辑与数据库分开。 这也意味着我正在 .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)
,它是否会将其转换为 SQL,如这个问题中所述?

c# pagination asp.net-2.0
2个回答
0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.