Procedura: raggruppare e aggregare dati mediante il controllo LinqDataSource
Aggiornamento: novembre 2007
Il controllo LinqDataSource consente di raggruppare dati da un'origine dati in base a una o più colonne di dati. Si raggruppano i record in base a una colonna quando si desidera recuperare informazioni su tutti i record di un'origine dati che condividono un valore nella colonna raggruppata. Frequentemente si utilizzano funzioni di aggregazione sui dati raggruppati per calcolare valori quali la somma, la media o il conteggio.
Per definire quali colonne di dati utilizzare per raggruppare i dati, va impostata la proprietà GroupBy del controllo LinqDataSource. Quando si desidera utilizzare le funzioni di aggregazione, va anche specificato un valore per la proprietà Select per definire tali funzioni.
Nota: |
---|
Non è possibile aggiornare, inserire o eliminare record quando i dati utilizzati sono raggruppati. |
Raggruppamento e aggregazione di dati in base a una colonna
È possibile raggruppare dati in base a una sola colonna specificando la colonna nella proprietà GroupBy.
Per raggruppare e aggregare in base a una colonna
Impostare ContextTypeName del controllo LinqDataSource su un'origine dati.
Impostare la proprietà TableName sulla proprietà dell'oggetto origine dati che contiene i dati da raggruppare.
Impostare la proprietà GroupBy sulla colonna da utilizzare per raggruppare i dati.
Impostare la proprietà Select in modo da includere una funzione di aggregazione e la colonna utilizzata per raggruppare i dati.
La proprietà specificata nella proprietà GroupBy viene recuperata tramite un oggetto denominato Key. È necessario assegnare nomi (alias) alle funzioni di aggregazione utilizzando la parola chiave As così che un controllo con associazione a dati possa fare riferimento alla proprietà creata in base alla funzione di aggregazione. L'oggetto LinqDataSourceView genera un'eccezione se una funzione di aggregazione non ha un nome.
Nell'esempio seguente viene mostrato un controllo LinqDataSource che utilizza una colonna denominata ProductCategory per raggruppare i dati e i risultati vengono visualizzati mediante un controllo GridView. I valori ProductCategory vengono selezionati tramite la proprietà Key. Viene quindi calcolata la media delle proprietà ListPrice e Cost per i prodotti con lo stesso valore ProductCategory. Inoltre, viene restituito un conteggio del numero di record per ogni valore ProductCategory.
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" GroupBy="ProductCategory" Select="new(Key, Average(ListPrice) As AverageListPrice, Average(Cost) As AverageCost, Count() As RecordCount)" ID="LinqDataSource1" > </asp:LinqDataSource> <asp:GridView DataSourceID="LinqDataSource1" ID="GridView1" > </asp:GridView>
Raggruppamento e aggregazione in base a più colonne
Per raggruppare dati in base a più colonne è necessario utilizzare la funzione new quando si imposta la proprietà GroupBy.
Per raggruppare in base a più colonne
Impostare la proprietà ContextTypeName e la proprietà TableName come descritto nella procedura precedente.
Impostare la proprietà GroupBy utilizzando una sintassi come new(column1, column2), dove column1 e column2 sono i nomi delle colonne da utilizzare per raggruppare i dati. È possibile specificare il numero di colonne necessario.
Impostare la proprietà Select in modo da includere la proprietà Key e le funzioni di aggregazione necessarie.
Nell'esempio seguente viene mostrato un controllo LinqDataSource configurato per raggruppare in base a due colonne e i risultati vengono visualizzati in un controllo DataList. L'oggetto Key contiene due proprietà, ProductCategory e Color.
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" GroupBy="new(ProductCategory,Color)" Select="new(Key, Average(ListPrice) as AverageListPrice, Count() as RecordCount)" ID="LinqDataSource1" > </asp:LinqDataSource> <asp:DataList DataSourceID="LinqDataSource1" ID="DataList1" > <ItemTemplate> <%# Eval("Key.ProductCategory") %> <%# Eval("Key.Color") %> <%# Eval("AverageListPrice") %> <%# Eval("RecordCount") %> </ItemTemplate> </asp:DataList>
Recupero di singoli record nei raggruppamenti di dati
Una volta raggruppati i dati in base a una o più colonne, è possibile recuperare singoli record in ogni raggruppamento utilizzando la parola chiave It. Questa parola chiave rappresenta l'istanza corrente dell'oggetto dati. I dati restituiti includeranno i dati raggruppati e i record che appartengono a un gruppo.
Per recuperare e visualizzare dati raggruppati e singoli record
Impostare la proprietà ContextTypeName e la proprietà TableName del controllo LinqDataSource.
Impostare la proprietà GroupBy sulla colonna o sulle colonne da utilizzare per raggruppare i dati.
Impostare la proprietà Select in modo da includere la parola chiave It e le funzioni di aggregazione necessarie. L'oggetto rappresentato dalla parola chiave It deve essere rinominato con la parola chiave As.
Nell'esempio seguente viene mostrato un controllo LinqDataSource configurato per raggruppare in base a due colonne. La proprietà Key fa riferimento a un oggetto con due proprietà, ProductCategory e Color. L'oggetto rappresentato da It viene rinominato in Products. L'oggetto Products rinominato contiene un insieme dei singoli record in un raggruppamento. Ogni istanza conterrà tutte le colonne dalla tabella Products.
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" GroupBy="new(ProductCategory,Color)" Select="new(Key, It As Products, Max(ListPrice) As MaxListPrice, Min(ListPrice) As MinListPrice)" ID="LinqDataSource1" > </asp:LinqDataSource>
Nell'esempio seguente vengono mostrati due controlli ListView che visualizzano i dati raggruppati e i singoli nomi di prodotti che appartengono a quel gruppo. La proprietà DataSource del controllo con associazione a dati nidificato viene impostata su Products, che è l'alias dell'oggetto it.
<asp:ListView DataSourceID="LinqDataSource1" ID="ListView1" > <LayoutTemplate> <table style="background-color:Teal;color:White" class="Layout"> <thead> <tr> <th><b>Product Category</b></th> <th><b>Color</b></th> <th><b>Highest Price</b></th> <th><b>Lowest Price</b></th> </tr> </thead> <tbody id="itemContainer"> </tbody> </table> </LayoutTemplate> <ItemTemplate> <tr> <td><%# Eval("Key.ProductCategory") %></td> <td><%# Eval("Key.Color") %></td> <td><%# Eval("MaxListPrice") %></td> <td><%# Eval("MinListPrice") %></td> </tr> <tr> <td colspan="4"> <asp:ListView DataSource='<%# Eval("Products") %>' ID="ListView2"> <LayoutTemplate> <div style=" width:100%;background-color:White;color:Black" id="itemContainer"> </div> </LayoutTemplate> <ItemTemplate> <%# Eval("ProductName") %><br /> </ItemTemplate> </asp:ListView> </td> </tr> </ItemTemplate> </asp:ListView>