Question

J'utilise un service Web qui renvoie une liste de produits. J'ai créé une vue de grille par programme et utilisé la liste comme source de données. Cependant, je ne peux pas utiliser les méthodes de pagination / tri car cela provoque des erreurs car je n'utilise pas de contrôle ObjectSource. J'ai traité la pagination et le tri manuellement, mais je ne sais pas si je le fais efficacement. Lorsque l'utilisateur clique sur une nouvelle page, je modifie l'index de page de la manière suivante:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

    this.gvProductList.PageIndex = e.NewPageIndex;
    this.gvProductList.DataSource = userProducts;
    gvProductList.DataBind();
}

Cependant, la base de données est toujours appelée lorsque je change de page. Y a-t-il un moyen de rendre cela plus efficace, ou est-ce normal pour la pagination? Il en va de même pour le tri, qui utilise le service Web pour obtenir les produits, puis utilise une expression lambda pour trier les produits en fonction de différentes colonnes. Chaque fois que cela se produit, la base de données est appelée (afin de récupérer la liste des produits). Est-ce que je gère cela à tort? Je sais que je peux utiliser des sessions et autres pour stocker la liste, mais il peut y avoir des centaines d'objets personnalisés par liste et des dizaines de milliers d'utilisateurs à la fois.

Je dois noter que le service Web est fourni par un tiers (c'est donc leur base de données appelée), ce qui signifie que je n'aurai pas accès à SQL Server ni à aucune méthode pour modifier le service Web.

Merci pour toute aide.

EDIT: Je devrais mentionner que la liste de produits est le panier d'achat de l'utilisateur. Par conséquent, il est unique par utilisateur.

Consensus général: si le panier ne contient pas beaucoup d'articles, la méthode actuelle serait correcte. Toutefois, si la mise en cache est requise, vous pouvez utiliser les sessions In Proc ou stocker les sessions sur un serveur SQL.

Était-ce utile?

La solution

Non, ce n'est pas efficace puisque vous ramenez tous les enregistrements de la base de données sous-jacente (en supposant que GetProductList () renvoie tous les enregistrements). La pagination GridView signifie simplement qu’elle affiche uniquement le nombre de lignes définies dans PageSize pour le PageIndex donné - mais cela n’affecte pas le nombre d’enregistrements réellement renvoyés par la source de données.

Malheureusement, comme vous n'avez pas d'accès direct à la base de données et que le service Web ne propose aucune autre méthode, le mieux que vous puissiez faire est probablement met en cache les données . Heureusement, asp.net simplifie la la mise en cache des données . L'objet Cache est un peu comme Session, sauf que vous n'avez qu'une seule instance par application et non par utilisateur.

Autres conseils

On dirait que vous récupérez tous les produits du service Web, puis effectuez le tri et la pagination à partir de votre page Web. Cela signifie que vous récupérez plus de données du service Web que vous n'en avez besoin à un moment donné. Le service Web fournit-il la possibilité de passer des arguments représentant la page, la taille de la page et l'ordre de tri requis? Sinon, vous devriez peut-être discuter de la possibilité d'ajouter ces fonctionnalités avec le tiers qui fournit le service.

Si cela n’est pas possible, à quelle fréquence la liste de produits est-elle mise à jour? S'il est mis à jour relativement peu fréquemment, vous pouvez utiliser le cache ASP.NET pour stocker les résultats de l'appel de service Web localement. La source de données en cache peut être configurée pour expirer toutes les heures, par exemple. De cette manière, les utilisateurs qui consultent cette page obtiendront une liste de produits raisonnablement à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top