Le nuove modalità di data binding di ASP.NET 4.5 rappresentano un deciso passo in avanti rispetto alle precedenti versioni: funzionalità quali ordinamento o paginazione, che in passato ci richiedevano comunque di scrivere del codice, oggi sono gestite in maniera assolutamente automatica grazie al supporto alla tecnologia LINQ e, in particolare, all'interfaccia IQueryable.
Immaginiamo di aver creato una GridView come quella seguente, per la quale abbiamo impostato a true le proprietà AllowSorting e AllowPaging:
<asp:GridView runat="server" ID="theGrid" AllowPaging="true" AllowSorting="true"> </asp:GridView>
Quando agganciamo un nuovo SelectMethod, il metodo stub che viene creato da Visual Studio restituisce un oggetto di tipo IQueryable<T>:
public IQueryable<Customer> GetCustomers() { return null; }
Al contrario di quanto accadeva con gli ObjectDataSource, l'aspetto interessante è che per supportare paginazione e ordinamento in questo metodo, non è richiesto alcun parametro addizionale. Se, per esempio, stiamo utilizzando Entity Framework Code First per accedere alla base dati, è sufficiente restituire l'intero DbSet, con un ordinamento di default:
public IQueryable<Customer> GetCustomers() { return _context.Customers .OrderBy(c => c.CompanyName); }
L'interfaccia IQueryable, infatti, è in grado di mantenere al suo interno l'expression tree degli ulteriori operatori aggiunti autonomamente dalla GridView (ossia Skip/Take per la paginazione e OrderBy per l'ordinamento), così che possano essere tradotti in linguaggio T-SQL. Il risultato è che ordinamento e paginazione vengano eseguiti effettivamente a livello di database, generando una query simile a questa:
SELECT TOP (10) ... FROM ... [dbo].[Customers] AS [Extent1] WHERE [Extent1].[row_number] > 0 ORDER BY [Extent1].[CompanyName] ASC
L'unico accorgimento da adottare è di lasciare attivo il DbContext fino al termine delle operazioni di binding, istanziandolo nel metodo OnInit e invocandone il Dispose all'interno di OnUnload:
private Northwind _context; protected override void OnInit(EventArgs e) { base.OnInit(e); _context = new Northwind(); } protected override void OnUnload(EventArgs e) { base.OnUnload(e); if (_context != null) _context.Dispose(); }
Ovviamente questo approccio non è limitato a Entity Framework: la potenza di LINQ risiede proprio nel fatto che le logiche di funzionamento che abbiamo descritto prescindono dall'effettiva fonte dati e, pertanto, qualsiasi provider in grado di supportare paginazione e ordinamento (per esempio, WCF Data Services) funzionerà secondo queste stesse modalità.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare l'organizzazione delle risorse con Azure Policy
Change tracking e composition in Entity Framework
Creare una libreria CSS universale: Clip-path
Path addizionali per gli asset in ASP.NET Core MVC
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Usare le navigation property in QuickGrid di Blazor
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Utilizzare il trigger SQL con le Azure Function
Creare una libreria CSS universale: i bottoni
Sostituire la GitHub Action di login su private registry
I più letti di oggi
- Evitare l'embedding di file resx per la localizzazione in ASP.NET
- Utilizzare l'espressione if inline in una pipeline di Azure DevOps
- Mono 2.4.2 con ASP.NET MVC e MonoTouch per iPhone
- Disponibili la Release Preview di Windows 8 e la Release Candidate di Visual Studio 2012
- Microsoft svela i dettagli dello store di Windows 8
- Ed ora, anche Windows .NET Server Developer Resource
- VS 2005 e SQL Server 2005 Express da scaricare
- Nuova CTP di VS 2005 a Novembre
- Blazor <3 Javascript