我的 gridview 分页/排序效率低下吗?

Is my gridview paging/sorting inefficient?

提问人:keyboardP 提问时间:10/26/2009 最后编辑:keyboardP 更新时间:10/26/2009 访问量:1297

问:

我正在使用返回产品列表的 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 上来实现。

asp.net 列表 排序网格 分页

评论


答:

1赞 pmarflee 10/26/2009 #1

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

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

评论

0赞 keyboardP 10/26/2009
我已经联系了第三方,看看是否有可能。如果是,是否只是传递相对参数(例如每页的项目数等)?还是我必须完全改变我的方法?产品列表实际上是用户的购物车。因此,只有当他们手动更新它时,它才会更新。
0赞 pmarflee 10/26/2009
@TenaciousImpy:用户的购物车中可能同时有多少件商品?如果我们只谈论个位数/两位数,那么您目前的方法可能已经足够了。在服务中对结果进行排序和分页可能有点矫枉过正。为了避免在每次更改页面时获取购物车的内容,您可以在页面首次加载时将购物车的内容缓存在 ASP.NET 会话中。会话状态是每个用户的,而不是每个应用程序的,因此每个用户都将获得自己的会话状态。
0赞 keyboardP 10/26/2009
@pmarflee - 感谢您的帮助。我猜每个用户大约有 60 个项目左右。如果第三方获得了太多不必要的点击,我可能会求助于会话。现在,我将保持原样。
2赞 Dan Diplo 10/26/2009 #2

不,它效率不高,因为您要恢复基础数据库中的每条记录(假定 GetProductList() 返回所有记录)。GridView 分页仅意味着它仅显示给定 PageIndex 在 PageSize 中定义的行数,但不会影响从数据源实际返回的记录数。

不幸的是,由于您无法直接访问数据库,并且 Web 服务不提供任何其他方法,因此您可能做的最好的事情就是缓存数据。幸运的是,asp.net 使缓存数据变得非常简单。Cache 对象与 Session 非常相似,只不过每个应用程序只有一个实例,而不是每个用户。

评论

0赞 keyboardP 10/26/2009
我想过使用缓存,但产品列表不是通用的。它本质上是用户的购物车,因此它对每个用户来说都是唯一的。
0赞 Dan Diplo 10/26/2009
在那种情况下,我不会担心——我怀疑任何人的购物篮里都会有很多产品。如果您确实想缓存结果,则可以使用 Session。如果您担心内存问题,请记住,您可以将会话状态存储在 SQL Server 中。
0赞 keyboardP 10/26/2009
谢谢你的帮助,丹。平均而言,每个篮子大约有 60 件商品。我会一步一步来。如果第三方服务器上的点击次数过多,我会在处理会话中使用。如果这被证明太占用内存,我将使用 SQL Server 会话。谢谢!