如何在不使用存储过程的情况下为绑定到ObjectDataSource的GridView实现自定义分页?
我有一个搜索屏幕,允许用户应用一些过滤器来创建自定义搜索。(对于每个选择了除"All"以外的值的DropDownList控件,我需要在SQL语句的"where"子句中添加一个筛选器)。
我想动态地构建SQL查询。通常我使用存储过程并使用ROW_NUMBER()(参见此处)但是如何在c#代码级别实现分页呢?
有没有办法做到这一点?或者我唯一的选择是在存储过程中实现动态SQL(请参阅此处)?
感谢
基本上,如果在ListView
和ObjectDataSource
上启用分页,数据源会将当前页码和页面大小传递给数据提供程序类(在ObjectDataSource
中配置的类)。
下面是一个工作示例:
http://netpl.blogspot.com/2009/04/how-to-controll-aspnet-listview-page.html
具体来说,看看数据提供程序类PersonDataSource
。
public class PersonDataSource
{
public IEnumerable<Person> Retrieve( int StartRow, int RowCount )
{
return DataModel.Instance.Persons.Skip( StartRow ).Take( RowCount );
}
public int CountItems()
{
return DataModel.Instance.Persons.Count;
}
}
您可以自由实现提供程序,这意味着您可以从内存、数据库中检索对象,也可以使用ORM或创建SqlCommand
。没有限制。
我不会在应用程序级别实现分页,而是创建一个分页查询。应用程序级别的分页意味着从数据库中检索数据,并在应用程序级别进行筛选,这在性能方面通常比在数据库级别进行筛选差。
如果您想创建自己的分页查询,那么至少有几种方法可以做到这一点,无论是否使用ROW_NUMBER。