Cómo: Agrupar y agregar datos utilizando el control LinqDataSource
Actualización: noviembre 2007
El control LinqDataSource permite agrupar datos de un origen de datos según una o varias columnas de datos. Los registros se agrupan por una columna si se desea recuperar información sobre todos los registros de un origen de datos que comparten un valor en la columna agrupada. Con frecuencia, usa funciones de agregado en datos agrupados para calcular valores como la suma, la media o el recuento.
Para definir las columnas de datos que se usan para agrupar los datos, se establece la propiedad GroupBy del control LinqDataSource. Si desea usar las funciones de agregado, también especifica un valor para que la propiedad Select defina las funciones de agregado.
Nota: |
---|
No puede actualizar, insertar ni eliminar registros si los datos con los que trabaja están agrupados. |
Agrupar y agregar datos por una columna
Puede agrupar datos basándose en una columna única si especifica dicha columna en la propiedad GroupBy.
Para agrupar y agregar por una columna
Establezca la propiedad ContextTypeName del control LinqDataSource en un origen de datos.
Establezca la propiedad TableName en la propiedad del objeto de origen de datos que contiene los datos que desea agrupar.
Establezca la propiedad GroupBy en la columna que desea usar para agrupar los datos.
Establezca la propiedad Select para incluir una función de agregado y la columna que se usa para agrupar los datos.
La propiedad que se especifica en la propiedad GroupBy se recupera a través de un objeto denominado Key. Debe asignar nombres (alias) a las funciones de agregado con la palabra clave As, de forma que un control enlazado a datos pueda hacer referencia a la propiedad creada por la función de agregado. El objeto LinqDataSourceView inicia una excepción si una función de agregado no tiene nombre.
El ejemplo siguiente muestra un control LinqDataSource que usa una columna denominada ProductCategory para agrupar datos y muestra los resultados con un control GridView. Selecciona los valores de ProductCategory mediante la propiedad Key. A continuación, calcula la media de las propiedades ListPrice y Cost de los productos con el mismo valor en ProductCategory. También devuelve un recuento del número de registros para cada valor de 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>
Agrupar y agregar por varias columnas
Para agrupar datos en función de varias columnas, debe usar la función new al establecer la propiedad GroupBy.
Para agrupar por varias columnas
Establezca las propiedades ContextTypeName y TableName tal como se describe en el procedimiento anterior.
Establezca la propiedad GroupBy con sintaxis como new(column1, column2), donde column1 y column2 son los nombres de las columnas que desea usar para agrupar los datos. Puede proporcionar tantas columnas como sea necesario.
Establezca la propiedad Select para incluir la propiedad Key y cualquier función de agregado que necesite.
El ejemplo siguiente muestra un control LinqDataSource configurado para agrupar por dos columnas y que muestra el resultado en un control DataList. El objeto Key contiene dos propiedades, ProductCategory y 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>
Recuperar registros individuales al agrupar datos
Cuando agrupa datos en función de una o varias columnas, puede recuperar los registros individuales de cada agrupación con la palabra clave It. Esta palabra clave representa la instancia actual del objeto de datos. Los datos devueltos incluirán los datos agrupados y los registros que pertenecen a un grupo.
Para recuperar y mostrar datos agrupados y registros individuales
Establezca las propiedades ContextTypeName y TableName del control LinqDataSource.
Establezca la propiedad GroupBy en la columna o columnas que desea usar para agrupar los datos.
Establezca la propiedad Select para incluir la palabra clave It y cualquier función de agregado que necesite. Se debe cambiar el nombre del objeto representado por la palabra clave It con la palabra clave As.
El ejemplo siguiente muestra un control LinqDataSource configurado para agrupar por dos columnas. La propiedad Key hace referencia a un objeto que tiene dos propiedades, ProductCategory y Color. Se cambia el nombre del objeto representado por It a Products. El objeto Products con el nombre cambiado contiene una colección de los registros individuales de una agrupación. Cada instancia contiene todas las columnas de la tabla 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>
El ejemplo siguiente muestra dos controles ListView que presentan los datos agrupados y los nombres individuales de los productos que pertenecen a dicho grupo. La propiedad DataSource del control enlazado a datos anidado se establece en Products, que es el alias del objeto 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>
Vea también
Conceptos
Información general sobre el control de servidor web LinqDataSource