如何:使用 LinqDataSource 控件对数据进行分组和聚合
更新:2007 年 11 月
LinqDataSource 控件使您能够按照一个或多个数据列对数据源中的数据进行分组。当要检索有关数据源中共享列中某个值的所有记录的信息时,可按该列对这些记录进行分组。通常,对分组的数据使用聚合函数来计算各种值,如总和、平均值或计数。
若要定义将哪些数据列用于数据分组,请设置 LinqDataSource 控件的 GroupBy 属性。当要使用聚合函数时,也可以为 Select 属性指定一个值以定义聚合函数。
说明: |
---|
当使用的是已分组的数据时,无法更新、插入或删除记录。 |
按一个列对数据进行分组和聚合
通过在 GroupBy 属性中指定单个列,可以基于该列对数据进行分组。
按一个列对数据进行分组和聚合
将 LinqDataSource 控件的 ContextTypeName 设置为一个数据源。
将 TableName 属性设置为包含要进行分组的数据的数据源对象中的属性。
将 GroupBy 属性设置为要用于对数据进行分组的列。
将 Select 属性设置为包含聚合函数和用于对数据进行分组的列。
可通过名为 Key 的对象检索 GroupBy 属性中指定的属性。必须使用 As 关键字为聚合函数指定名称(别名),以便数据绑定控件可以引用聚合函数创建的属性。如果聚合函数没有名称,则 LinqDataSourceView 对象将引发异常。
下面的示例演示一个 LinqDataSource 控件,该控件使用名为 ProductCategory 的列对数据进行分组,并使用 GridView 控件显示结果。示例通过 Key 属性选择 ProductCategory 值,然后计算具有相同 ProductCategory 值的产品的 ListPrice 和 Cost 属性的平均值,而且还返回每个 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" runat="server"> </asp:LinqDataSource> <asp:GridView DataSourceID="LinqDataSource1" ID="GridView1" runat="server"> </asp:GridView>
按多个列对数据进行分组和聚合
若要按多个列对数据进行分组,则必须在设置 GroupBy 属性时使用 new 函数。
按多个列进行分组
按以上过程所述,设置 ContextTypeName 属性和 TableName 属性。
使用类似于 new(column1, column2) 这样的语法设置 GroupBy 属性,其中 column1 和 column2 是要用于对数据进行分组的列的名称。可以提供所需数目的列。
设置 Select 属性以包含 Key 属性和所需的任何聚合函数。
下面的示例演示一个 LinqDataSource 控件,该控件配置为按两列进行分组并在 DataList 控件中显示结果。Key 对象包含 ProductCategory 和 Color 这两个属性。
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" GroupBy="new(ProductCategory,Color)" Select="new(Key, Average(ListPrice) as AverageListPrice, Count() as RecordCount)" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource> <asp:DataList DataSourceID="LinqDataSource1" ID="DataList1" runat="server"> <ItemTemplate> <%# Eval("Key.ProductCategory") %> <%# Eval("Key.Color") %> <%# Eval("AverageListPrice") %> <%# Eval("RecordCount") %> </ItemTemplate> </asp:DataList>
对数据进行分组时检索单个记录
按照一个或多个列对数据进行分组后,可以使用 It 关键字来检索每个分组中的各个记录。此关键字表示数据对象的当前实例。返回的数据将同时包含分组数据和属于某个组的记录。
检索并显示分组的数据和各个记录
设置 LinqDataSource 控件的 ContextTypeName 属性和 TableName 属性。
将 GroupBy 属性设置为要用于对数据进行分组的一个或多个列。
设置 Select 属性以包含 It 关键字和所需的任何聚合函数。必须使用 As 关键字重命名由 It 关键字表示的对象。
下面的示例演示一个配置为按两列进行分组的 LinqDataSource 控件。Key 属性引用具有 ProductCategory 和 Color 这两个属性的对象。将由 It 表示的对象重命名为 Products。重命名的 Products 对象包含一个分组中的各个记录的集合。每个实例均包含 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" runat="server"> </asp:LinqDataSource>
下面的示例演示两个 ListView 控件,二者显示分组的数据和属于该组的各个产品名称。嵌套的数据绑定控件的 DataSource 属性设置为 Products,即 it 对象的别名。
<asp:ListView DataSourceID="LinqDataSource1" ID="ListView1" runat="server"> <LayoutTemplate> <table style="background-color:Teal;color:White" runat="server" 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 runat="server" 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") %>' runat="server" ID="ListView2"> <LayoutTemplate> <div style=" width:100%;background-color:White;color:Black" runat="server" id="itemContainer"> </div> </LayoutTemplate> <ItemTemplate> <%# Eval("ProductName") %><br /> </ItemTemplate> </asp:ListView> </td> </tr> </ItemTemplate> </asp:ListView>