Практическое руководство. Группирование и агрегирование данных с помощью элемента управления LinqDataSource

Visual Studio 2010

Обновлен: Ноябрь 2007

Элемент управления LinqDataSource предназначен для группирования данных источника по одному или нескольким столбцам. Это позволяет извлечь из источника данных сведения обо всех записях, в которых содержатся одинаковые значения из указанного столбца. К сгруппированным данным часто применяются статистические функции, предназначенные для вычисления суммы, среднего значения или числа элементов.

Чтобы определить столбцы, используемые для группирования данных, следует установить значение свойства GroupBy элемента управления LinqDataSource. Чтобы определить используемую статистическую функцию, следует установить значение свойства Select.

Bb470251.alert_note(ru-ru,VS.100).gifПримечание.

При работе со сгруппированными данными не допускается обновление, вставка или удаление записей.

Чтобы сгруппировать данные по одному столбцу, укажите этот столбец в свойстве GroupBy.

Группирование и агрегирование по одному столбцу

  1. Задайте источник данных в качестве значения свойства ContextTypeName элемента управления LinqDataSource.

  2. Присвойте свойству TableName значение свойства в объекте источника данных, который содержит группируемые данные.

  3. Задайте в качестве значения свойства GroupBy столбец, по которому необходимо сгруппировать данные.

  4. Установите значение свойства Select, чтобы включить статистическую функцию и столбец, по которому группируются данные.

    Значение свойства GroupBy извлекается с помощью объекта Key. Статистическим функциям необходимо присвоить имена (псевдонимы) с помощью ключевого слова As. Это позволяет использовать в элементе управления с привязкой данных ссылки на свойства, созданные статистической функцией. Если статистической функции не присвоено имя, возникает исключение объекта LinqDataSourceView.

    В следующем примере показан элемент управления LinqDataSource, в котором реализуется группирование данных по столбцу ProductCategory и отображение результатов с помощью элемента управления GridView. Выбор значений из столбца ProductCategory осуществляется с помощью свойства Key. После этого вычисляются средние значения свойств ListPrice и Cost для продуктов с одинаковым значением ProductCategory. Также возвращается число записей для каждого значения 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>
    

При группировании данных по нескольким столбцам следует использовать функцию new для установки значения свойства GroupBy.

Группирование по нескольким столбцам

  1. Задайте значения свойств ContextTypeName и TableName, как описано в предыдущей процедуре.

  2. Задайте значение свойства GroupBy, используя синтаксис вида new(column1, column2), где 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. Установите значения свойств ContextTypeName и TableName элемента управления LinqDataSource.

  2. Задайте в качестве значения свойства GroupBy столбцы, которые следует использовать для группирования данных.

  3. Установите значение свойства Select, чтобы включить ключевое слово It и необходимые статистические функции. Представленному ключевым словом It объекту необходимо присвоить другое имя с помощью ключевого слова As.

    В следующем примере демонстрируется элемент управления 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 вложенного элемента управления с привязкой к данным присваивается значение, являющееся псевдонимом объекта 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>
    
Показ: