提问人:keyboardP 提问时间:10/26/2009 最后编辑:keyboardP 更新时间:10/26/2009 访问量:1297
我的 gridview 分页/排序效率低下吗?
Is my gridview paging/sorting inefficient?
问:
我正在使用返回产品列表的 Web 服务。我以编程方式创建了一个网格视图,并将列表用作数据源。但是,我不能使用 Paging/Sorting 方法,因为它会导致错误,因为我没有使用 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 Server 上来实现。
答:
看起来您正在从 Web 服务中获取所有产品,然后从网页中进行排序和分页。这意味着您从 Web 服务中提取的数据比任何时候都需要的数据多。Web 服务是否提供传递表示所需页面、页面大小和排序顺序的参数的功能?如果没有,也许您应该与提供服务的第三方讨论添加这些功能的可能性。
如果无法做到这一点,产品列表多久更新一次?如果更新频率相对较低,则可以使用 ASP.NET 缓存在本地存储 Web 服务调用的结果。缓存的数据源可以设置为每小时过期一次。这样,查看该页面的用户将看到一个相当最新的产品列表。
评论
不,它效率不高,因为您要恢复基础数据库中的每条记录(假定 GetProductList() 返回所有记录)。GridView 分页仅意味着它仅显示给定 PageIndex 在 PageSize 中定义的行数,但不会影响从数据源实际返回的记录数。
不幸的是,由于您无法直接访问数据库,并且 Web 服务不提供任何其他方法,因此您可能做的最好的事情就是缓存数据。幸运的是,asp.net 使缓存数据变得非常简单。Cache 对象与 Session 非常相似,只不过每个应用程序只有一个实例,而不是每个用户。
评论