代码之家  ›  专栏  ›  技术社区  ›  keyboardP

我的GridView分页/排序是否效率低下?

  •  2
  • keyboardP  · 技术社区  · 16 年前

    我正在使用返回产品列表的Web服务。我以编程方式创建了一个网格视图,并将列表用作数据源。但是,我不能使用分页/排序方法,因为它会导致错误,因为我没有使用ObjectSource控件。我手动处理分页和排序,但我不知道我是否能有效地完成。 当用户单击一个新页面时,我处理页面索引的更改,如下所示:

    protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
    
        userProducts = Data.GetProductList();
    
        this.gvProductList.PageIndex = e.NewPageIndex;
        this.gvProductList.DataSource = userProducts;
        gvProductList.DataBind();
    }
    

    但是,当我更改页面时总是调用数据库。有没有一种方法可以提高效率,或者对于分页来说这是正常的?排序也是如此,它使用Web服务获取产品,然后使用lambda表达式根据不同的列对产品进行排序。每次发生这种情况时,都会调用数据库(以便再次获取产品列表)。我处理得不对吗?我知道我可以使用会话等来存储列表,但是每个列表中可以有数百个自定义对象,并且在任何时候都可以有数万个用户。

    我需要注意的是,Web服务是由第三方提供的(所以调用的是他们的数据库),这意味着我不能访问SQL Server本身,也不能更改Web服务的任何方法。

    谢谢你的帮助。

    编辑:我应该提到产品列表是用户的购物车。因此,它对每个用户都是唯一的。

    一般共识: 如果购物车没有放很多东西,那么当前的方法就可以了。但是,如果需要缓存,可以通过使用进程内会话或在SQL服务器上存储会话来实现。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Dan Diplo    16 年前

    不,这是不有效的,因为您要返回基础数据库中的每个记录(假定getProductList()返回所有记录)。GridView分页仅意味着它只显示在pageSize中为给定pageIndex定义的行数,但它不影响实际从数据源返回的记录数。

    不幸的是,由于您没有直接访问数据库的权限,并且Web服务没有提供任何其他方法,所以您可以做的最好的事情是 cache the data . 幸运的是,ASP.NET cacheing data quite simple . 缓存对象与会话非常类似,只是每个应用程序只有一个实例,而不是每个用户。

        2
  •  1
  •   pmarflee    16 年前

    看起来您正在从Web服务中获取所有产品,然后在Web页面中进行排序和分页。这意味着您从Web服务中提取的数据比任何时候都要多。Web服务是否提供了传递表示所需页面、页面大小和排序顺序的参数的功能?如果没有,也许您应该与提供服务的第三方讨论添加这些功能的可能性。

    如果这不可能,多久更新一次产品列表?如果更新的频率相对较低,则可以使用ASP.NET缓存在本地存储Web服务调用的结果。缓存的数据源可以设置为每小时过期一次。这样,查看页面的用户将看到一个合理的最新产品列表。

    推荐文章