在ASP.NET 2.0高效的自定义分页排序时(Efficient Custom Paging in

2019-09-26 05:17发布

我有在ASP.NET 2.0中的Web应用程序中,我需要做的分页。 我的数据访问方法就是拉一个DataSet从数据库调用,然后将其转换成一个List<Foo> (其中foo是我喜欢的类型,我拉出DB)和我绑定GridView它。 我对这个的原因是,我不希望是具有全部通过我的应用程序使用的数据表字符串索引,而且我可以显示逻辑从数据库中通过实现显示逻辑上我的课性质分离。 这也意味着我做的.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

使用足够的元素,这成为延迟的源; 在我的开发机器连接到测试数据库,它需要几乎0.5秒从DB拉动5000条记录时,一个网格在屏幕上进行绑定。

为了解决这个问题,我该怎么有我所有的显示逻辑移动到SQL所以排序和分页可以发生在那里,或者有没有更好的办法?

此外,没有LINQ到SQL解决这个问题? 如果我在我的.NET类实现的自定义属性进行排序,然后使用.Skip(pageIndex * pageSize).Take(pageSize) ,它就会将其转换成SQL在注意到这个问题 ?

Answer 1:

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



Answer 2:

LINQ到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会被保存,这将加快东西亚秒响应。 在这种情况下,用户应该通知他们跑到数据库查询过于宽泛,他们需要缩小搜索条件becauase不是所有可能结果的结果。



文章来源: Efficient Custom Paging in ASP.NET 2.0 while sorting