我正在使用返回产品列表的网络服务。我以编程方式创建了一个网格视图,并使用该列表作为数据源。但是,我不能使用分页/排序方法,因为它导致错误,因为我没有使用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表达式根据各列对产品进行排序。每次发生这种情况时,都会调用数据库(以便再次获取产品列表)。我错误地处理了这件事吗?我知道我可以使用会话等来存储List,但每个列表可以有数百个自定义对象,而且任何时候都可以有数万个用户。

我应该注意,Web服务是由第三方提供的(因此它的数据库被调用),这意味着我将无法访问SQL Server本身,也无法访问任何更改Web服务的方法。

感谢您的帮助。

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

普遍共识:如果购物车没有持有多个商品,那么当前的方法就没问题。但是,如果需要缓存,可以通过使用In Proc会话或在SQL Server上存储会话来实现。

有帮助吗?

解决方案

不,它没有效率,因为你要带回底层数据库中的每条记录(假设GetProductList()返回所有记录)。 GridView分页只是意味着它只显示给定PageIndex在PageSize中定义的行数 - 但它不会影响从数据源实际返回的记录数。

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

其他提示

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

如果无法做到这一点,产品清单的更新频率是多少?如果相对不频繁地更新,则可以使用ASP.NET缓存在本地存储Web服务调用的结果。缓存的数据源可以设置为按小时计算到期。这样,查看该页面的用户将看到一个合理的最新产品列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top