如何:使用 LinqDataSource 控件对数据进行分组和聚合

更新:2007 年 11 月

LinqDataSource 控件使您能够按照一个或多个数据列对数据源中的数据进行分组。当要检索有关数据源中共享列中某个值的所有记录的信息时,可按该列对这些记录进行分组。通常,对分组的数据使用聚合函数来计算各种值,如总和、平均值或计数。

若要定义将哪些数据列用于数据分组,请设置 LinqDataSource 控件的 GroupBy 属性。当要使用聚合函数时,也可以为 Select 属性指定一个值以定义聚合函数。

Bb470251.alert_note(zh-cn,VS.90).gif说明:

当使用的是已分组的数据时,无法更新、插入或删除记录。

按一个列对数据进行分组和聚合

通过在 GroupBy 属性中指定单个列,可以基于该列对数据进行分组。

按一个列对数据进行分组和聚合

  1. LinqDataSource 控件的 ContextTypeName 设置为一个数据源。

  2. TableName 属性设置为包含要进行分组的数据的数据源对象中的属性。

  3. GroupBy 属性设置为要用于对数据进行分组的列。

  4. 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 函数。

按多个列进行分组

  1. 按以上过程所述,设置 ContextTypeName 属性和 TableName 属性。

  2. 使用类似于 new(column1, column2) 这样的语法设置 GroupBy 属性,其中 column1 和 column2 是要用于对数据进行分组的列的名称。可以提供所需数目的列。

  3. 设置 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 关键字来检索每个分组中的各个记录。此关键字表示数据对象的当前实例。返回的数据将同时包含分组数据和属于某个组的记录。

检索并显示分组的数据和各个记录

  1. 设置 LinqDataSource 控件的 ContextTypeName 属性和 TableName 属性。

  2. GroupBy 属性设置为要用于对数据进行分组的一个或多个列。

  3. 设置 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>
    

请参见

概念

LinqDataSource Web 服务器控件概述