Pergunta

Eu estou usando um serviço web que retorna uma lista de produtos. Eu criei um Grid View programaticamente e usou a lista como a fonte de dados. No entanto, não pode usar a paginação / classificação métodos uma vez que provoca erros desde que eu não estou usando um controle Objectsource. I lidou com a paginação e classificação manualmente, mas eu não sei se eu estou fazendo isso de forma eficiente. Quando o usuário clica em uma nova página, eu lidar com o índice página mudando assim:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

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

No entanto, o banco de dados é sempre chamado quando eu mudar as páginas. Existe uma maneira de tornar isso mais eficiente, ou isso é normal para paginação? O mesmo vale para a classificação, que usa o serviço web para obter os produtos, em seguida, usa uma expressão lambda para classificar os produtos de acordo com várias colunas. Cada vez que isso acontece, o banco de dados é chamado (a fim de obter a lista de produtos novamente). Estou lidando com isso de forma errada? Eu sei que posso usar sessões e tal para armazenar a lista, mas não pode haver centenas de objetos personalizados por lista e dezenas de milhares de usuários a qualquer momento.

Gostaria de salientar que o serviço web é fornecido por um terceiro (e por isso é seu banco de dados que está sendo chamado), o que significa que não terá acesso ao próprio SQL Server nem quaisquer métodos para alterar o serviço web.

Obrigado por qualquer ajuda.

EDIT: devo mencionar que a lista de produtos é carrinho de compras do usuário. Portanto, ele é único por usuário.

Geral Consenso: Se o carrinho de compras não está segurando muitos itens, o método atual ficaria bem. No entanto, se o cache é necessária, isto pode ser conseguido por qualquer usando sessões em Proc, ou armazenando sessões em um SQL Server.

Foi útil?

Solução

Não, não é eficiente, uma vez que você está trazendo de volta todos os registros no banco de dados subjacente (presumindo GetProductList () retorna todos os registros). A paginação GridView significa apenas que ele só mostra o número de linhas definidas na PageSize para o dado PageIndex -. Mas não afeta quantos registros são realmente devolvido a partir da fonte de dados

Infelizmente, desde que você não tem acesso direto ao banco de dados eo serviço web não oferece quaisquer outros métodos, então o melhor que você provavelmente pode fazer é cache dados. Felizmente asp.net faz dados cacheing bastante simples . O objeto de cache é um pouco como Session, exceto que você só tem uma instância por aplicativo, e não por usuário.

Outras dicas

Parece que você está buscando todos os produtos a partir do serviço web, em seguida, fazer a classificação e paginação de dentro de sua página web. Isso significa que você está puxando para trás mais dados do serviço de web do que você precisa, em qualquer momento um. Será que o serviço de web oferecem a facilidade para passar argumentos representando a página, tamanho de página e classificar ordem necessária? Se não, talvez você deve discutir a possibilidade de adicionar esses recursos com o terceiro que está fornecendo o serviço.

Se isto não for possível, quantas vezes é a lista de produtos atualizado? Se ele é atualizado com pouca frequência, você poderia usar o cache ASP.NET para armazenar os resultados da chamada de serviço web localmente. A fonte de dados em cache pode ser configurado para expirar em, digamos, numa base horária. Desta forma, os usuários visualizam a página verá uma lista razoavelmente up-to-date de produtos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top