Pregunta

Estoy usando un servicio web que devuelve una lista de productos. Creé una vista de cuadrícula programáticamente y usé la lista como fuente de datos. Sin embargo, no puedo usar los métodos de Localización / Clasificación ya que causa errores ya que no estoy usando un control ObjectSource. Manejé la paginación y la clasificación manualmente, pero no sé si lo estoy haciendo de manera eficiente. Cuando el usuario hace clic en una nueva página, manejo el índice de páginas cambiando así:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

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

Sin embargo, siempre se llama a la base de datos cuando cambio de página. ¿Hay alguna manera de hacer que esto sea más eficiente o es normal para la paginación? Lo mismo ocurre con la clasificación, que utiliza el servicio web para obtener los productos, y luego usa una expresión lambda para clasificar los productos según varias columnas. Cada vez que esto sucede, se llama a la base de datos (para volver a obtener la lista de productos). ¿Estoy manejando esto mal? Sé que puedo usar sesiones y otras para almacenar la Lista, pero puede haber cientos de objetos personalizados por lista y decenas de miles de usuarios a la vez.

Debo tener en cuenta que el servicio web es proporcionado por un tercero (y por eso se llama a su base de datos), lo que significa que no tendré acceso al propio SQL Server ni a ningún método para cambiar el servicio web.

Gracias por cualquier ayuda.

EDITAR: Debo mencionar que la lista de productos es el carrito de la compra del usuario. Por lo tanto, es único por usuario.

Consenso general: Si el carrito de la compra no tiene muchos artículos, el método actual estaría bien. Sin embargo, si se requiere el almacenamiento en caché, esto se puede lograr mediante el uso de sesiones In Proc o almacenando sesiones en un servidor SQL.

¿Fue útil?

Solución

No, no es eficiente ya que está recuperando cada registro en la base de datos subyacente (suponiendo que GetProductList () devuelve todos los registros). La paginación de GridView solo significa que solo muestra el número de filas definidas en Tamaño de página para el PageIndex dado, pero no afecta la cantidad de registros que se devuelven desde la fuente de datos.

Lamentablemente, dado que no tiene acceso directo a la base de datos y el servicio web no ofrece ningún otro método, lo mejor que puede hacer es almacena en caché los datos . Afortunadamente, asp.net hace que el almacenamiento en caché de datos sea bastante simple . El objeto Cache es más bien como Session, excepto que solo tienes una instancia por aplicación, no por usuario.

Otros consejos

Parece que estás obteniendo todos los productos del servicio web y luego realizas la clasificación y la paginación desde tu página web. Esto significa que está retirando más datos del servicio web de los que necesita en un momento dado. ¿El servicio web proporciona la facilidad para pasar argumentos que representan la página requerida, el tamaño de la página y el orden de clasificación? Si no es así, tal vez debería discutir la posibilidad de agregar estas características con el tercero que proporciona el servicio.

Si esto no es posible, ¿con qué frecuencia se actualiza la lista de productos? Si se actualiza con poca frecuencia, puede usar el caché de ASP.NET para almacenar los resultados de la llamada del servicio web localmente. La fuente de datos almacenada en caché podría configurarse para que caduque cada hora, por ejemplo. De esta manera, los usuarios que vean la página verán una lista de productos razonablemente actualizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top