3

我正在尝试在 asp.net 中找到一个解决方案以实现数据分页,因此 1)应用程序不必在每个页面索引更改时连接到 DB,以便检索整个集合或仅检索一组分页结果 2 ) 不想将结果存储在 Viewstate 或 Session 中

对于大型结果集,我正在考虑将键值(ID、行号)存储在结果集(数组、json)中,然后在行绑定上填充其他行信息。

有没有办法在 asp.net 中做到这一点,或者我需要为这种情况考虑 jQuery。

4

3 回答 3

6

1) 应用程序不必在每次页面索引更改时连接到数据库,以检索整个结果集或仅检索一组分页结果

您需要缓存结果。例如:

例子:

缓存方法 1

    <asp:SqlDataSource runat="server" ID="sdsd"
        SelectCommand="select * from jobs"
        SelectCommandType="Text"
        DataSourceMode="DataSet"
        ConnectionString="<%$ConnectionStrings: PUBSConnectionString %>"
        CacheDuration="30"
        EnableCaching="true"
    >
    </asp:SqlDataSource>
    <asp:DropDownList ID="ddl" runat="server" AutoPostBack="true" DataSourceID="sdsd" DataTextField="job_desc" DataValueField="job_id">
    </asp:DropDownList>

缓存方法 2

您始终可以将结果缓存在代码中:

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        IEnumerable<employee> res = Enumerable.Empty<employee>();

        if (this.Cache["emp"] == null)
        {
            res = this.GetEmployeesFromDatabase();
            this.Cache["emp"] = res;
        }
        else
        {
            res = this.GetEmployeesFromCache();
        }

        this.grv.DataSource = res;
        this.grv.DataBind();
    }
}

protected IEnumerable<employee> GetEmployeesFromDatabase()
{
    // go to your database to get the objects
    return Enumerable.Empty<employee>();
}

protected IEnumerable<employee> GetEmployeesFromCache()
{
    return this.Cache["emp"] as IEnumerable<employee>;
}

请记住,返回的对象必须是DataSetorDataTable才能为缓存结果添加排序功能

2)不想将结果存储在 Viewstate 或 Session 中

同样,您需要使用缓存

有没有办法在 asp.net 中做到这一点,或者我需要为这种情况考虑 jQuery。

我看不出 jQuery(单独)如何帮助您满足您的要求,我的意思是,如果您使用 AJAX 帖子,您会提高当前页面的感知性能,但这无助于您与数据库的连接除非你使用缓存

于 2012-07-22T16:40:38.240 回答
2

我不确定它是否满足您的所有要求,但分页是PagedDataSource 类

封装允许其执行分页的数据绑定控件(例如 DataGrid、GridView、DetailsView 和 FormView)的分页相关属性。这个类不能被继承。

否则,我建议您查看JqGrid

于 2012-07-22T16:40:13.623 回答
1

对于分页数据集,您通常有 2 个选项:

  • 如果您期望一个小的结果集(即将搜索结果限制为 500 行或更少),那么使用 viewstate 是完全可以接受的。我个人更喜欢避免使用 session 来存储请求级别的数据

    • 如果您期望一个大型结果集,那么您将需要一个分页数据源。您可以编写一个返回分页数据集的存储过程(即传递页面索引/页面大小)或使用任何 ORM(实体框架或 LINQ TO SQL)。使用 take(n) 和 skip(n) 支持分页。

http://www.mssqltips.com/sqlservertip/1699/sql-server-stored-procedures-to-page-large-tables-or-queries/

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net- mvc-应用程序

无论您如何呈现数据(jQuery/ajax 或服务器控件),您仍然必须一次性获取整个结果集并将其缓存以供后续请求(json 数组或视图状态),或者您需要支持分页的数据源. 如果您关心性能,那么分页数据源是可行的方法(EF 示例也适用于 Web 表单,只需使用您的事件处理程序而不是 mvc 中的操作方法)。

于 2012-07-23T03:25:54.457 回答