Domanda

Sto utilizzando un servizio Web che restituisce un elenco di prodotti. Ho creato una vista griglia in modo programmatico e ho utilizzato l'elenco come origine dati. Tuttavia, non riesco a utilizzare i metodi di paging / ordinamento in quanto causa errori poiché non utilizzo un controllo ObjectSource. Ho gestito manualmente il paging e l'ordinamento, ma non so se lo sto facendo in modo efficiente. Quando l'utente fa clic su una nuova pagina, gestisco l'indice della pagina cambiando in questo modo:

protected void gvProductList_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    userProducts = Data.GetProductList();

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

Tuttavia, quando cambio pagina, il database viene sempre chiamato. C'è un modo per renderlo più efficiente o è normale per il paging? Lo stesso vale per l'ordinamento, che utilizza il servizio Web per ottenere i prodotti, quindi utilizza un'espressione lambda per ordinare i prodotti in base a varie colonne. Ogni volta che ciò accade, viene chiamato il database (per ottenere nuovamente l'elenco dei prodotti). Sto gestendo questo in modo errato? So di poter utilizzare sessioni e simili per memorizzare l'elenco, ma ci possono essere centinaia di oggetti personalizzati per elenco e decine di migliaia di utenti contemporaneamente.

Dovrei notare che il servizio Web è fornito da una terza parte (e quindi viene chiamato il loro database), il che significa che non avrò accesso allo stesso SQL Server né a nessun metodo per cambiare il servizio web.

Grazie per l'aiuto.

EDIT: dovrei menzionare che l'elenco dei prodotti è il carrello dell'utente. Pertanto, è unico per utente.

Consenso generale: se il carrello non contiene molti articoli, l'attuale metodo andrebbe bene. Tuttavia, se è richiesta la memorizzazione nella cache, ciò può essere ottenuto utilizzando le sessioni In Proc o archiviando le sessioni su un server SQL.

È stato utile?

Soluzione

No, non è efficiente poiché stai riportando tutti i record nel database sottostante (presumendo che GetProductList () restituisca tutti i record). Il paging di GridView indica solo che mostra solo il numero di righe definite in PageSize per il PageIndex specificato, ma non influisce sul numero di record effettivamente restituiti dall'origine dati.

Sfortunatamente, poiché non hai accesso diretto al database e il servizio web non offre altri metodi, probabilmente il meglio che puoi fare è memorizza nella cache i dati . Fortunatamente asp.net rende dati di cache abbastanza semplici . L'oggetto Cache è piuttosto simile a Sessione, tranne per il fatto che hai solo un'istanza per applicazione, non per utente.

Altri suggerimenti

Sembra che stai recuperando tutti i prodotti dal servizio Web, quindi eseguendo l'ordinamento e il paging all'interno della tua pagina web. Ciò significa che stai recuperando più dati dal servizio web di quanti ne hai bisogno in qualsiasi momento. Il servizio Web offre la possibilità di passare argomenti che rappresentano la pagina richiesta, le dimensioni della pagina e l'ordinamento? In caso contrario, forse dovresti discutere della possibilità di aggiungere queste funzionalità con le terze parti che forniscono il servizio.

Se ciò non è possibile, con che frequenza viene aggiornato l'elenco dei prodotti? Se viene aggiornato relativamente di rado, è possibile utilizzare la cache ASP.NET per archiviare i risultati della chiamata del servizio Web localmente. L'origine dati memorizzata nella cache potrebbe essere impostata per scadere, ad esempio, su base oraria. In questo modo, gli utenti che visualizzano la pagina visualizzeranno un elenco di prodotti ragionevolmente aggiornato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top