Gewusst wie: Gruppieren und Aggregieren von Daten mithilfe des LinqDataSource-Steuerelements

Aktualisiert: November 2007

Mit dem LinqDataSource-Steuerelement können Sie Daten aus einer Datenquelle in Form einer oder mehrerer Datenspalten gruppieren. Sie gruppieren Datensätze nach Spalten, wenn Sie Informationen über sämtliche Datensätze in einer Datenquelle abrufen möchten, die über einen gemeinsamen Wert in der gruppierten Spalte verfügen. Sie verwenden Aggregatfunktionen häufig bei gruppierten Daten, um Werte wie Summe, Mittelwert oder Anzahl zu berechnen.

Zur Festlegung der für die Datengruppierung zu verwendenden Spalten legen Sie die GroupBy-Eigenschaft des LinqDataSource-Steuerelements fest. Wenn Sie die Aggregatfunktionen verwenden möchten, geben Sie ebenfalls einen Wert für die Select-Eigenschaft an, um die Aggregatfunktionen zu definieren.

Hinweis:

Wenn die Daten, mit denen Sie arbeiten, gruppiert sind, können Sie die Datensätze nicht aktualisieren, einfügen oder löschen,.

Gruppieren und Aggregieren von Daten nach einer Spalte

Sie können Daten auf Grundlage einer einzelnen Spalte gruppieren, indem Sie die Spalte in der GroupBy-Eigenschaft angeben.

So gruppieren und aggregieren Sie nach einer Spalte

  1. Legen Sie den ContextTypeName für das LinqDataSource-Steuerelement auf eine Datenquelle fest.

  2. Legen Sie die TableName-Eigenschaft auf die Eigenschaft im Datenquellenobjekt fest, das die zu gruppierenden Daten enthält.

  3. Legen Sie die GroupBy-Eigenschaft auf die Spalte fest, die Sie zum Gruppieren der Daten verwenden möchten.

  4. Legen Sie die Select-Eigenschaft so fest, dass eine Aggregatfunktion und die zum Gruppieren der Daten verwendete Spalte eingeschlossen werden.

    Die Eigenschaft, die in der GroupBy-Eigenschaft angegeben wird, wird durch ein Objekt mit dem Namen Key abgerufen. Sie müssen Namen (Aliase) zuweisen, um Funktionen mithilfe des As-Schlüsselworts zu aggregieren, sodass ein datengebundenes Steuerelement auf die Eigenschaft verweisen kann, die mithilfe der Aggregatfunktion erstellt wurde. Das LinqDataSourceView-Objekt löst eine Ausnahme aus, wenn eine Aggregatfunktion über keinen Namen verfügt.

    Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das eine mit ProductCategory benannte Spalte zum Gruppieren von Daten verwendet und stellt die Ergebnisse mithilfe eines GridView-Steuerelements dar. Es wählt die ProductCategory-Werte über die Key-Eigenschaft aus. Anschließend wird der Mittelwert für die ListPrice- und Cost-Eigenschaften für Produkte berechnet, die über denselben ProductCategory-Wert verfügen. Darüber hinaus wird die Anzahl der Datensätze für jeden ProductCategory-Wert zurückgegeben.

    <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>
    

Gruppieren und Aggregieren nach mehreren Spalten

Um Daten nach mehreren Spalten zu gruppieren, müssen Sie die new-Funktion verwenden, wenn Sie die GroupBy-Eigenschaft festlegen.

So gruppieren Sie nach mehreren Spalten

  1. Legen Sie die ContextTypeName-Eigenschaft und die TableName-Eigenschaft fest, wie im vorangegangenen Verfahren erläutert.

  2. Legen Sie die GroupBy-Einstellung fest, indem Sie eine Syntax wie new(column1, column2) verwenden, wobei column1 und column2 die Namen der Spalten sind, die Sie zum Gruppieren der Daten verwenden möchten. Sie können so viele Spalten angeben wie nötig.

  3. Legen Sie die Select-Eigenschaft so fest, dass die Key-Eigenschaft und sämtliche benötigten Aggregatfunktionen eingeschlossen werden.

    Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, dass so konfiguriert wurde, dass eine Gruppierung nach zwei Spalten erfolgt und die Ergebnisse in einem DataList-Steuerelement angezeigt werden. Das Key-Objekt enthält zwei Eigenschaften, ProductCategory und 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>
    

Abrufen von einzelnen Datensätzen beim Gruppieren von Daten

Wenn Sie Daten nach mindestens einer Spalte gruppiert haben, können Sie mithilfe des It-Schlüsselworts die einzelnen Datensätze in jeder Gruppierung abrufen. Dieses Schlüsselwort stellt die aktuelle Instanz des Datenobjekts dar. Die zurückgegebenen Daten schließen sowohl die gruppierten Daten als auch die Datensätze ein, die zu einer Gruppe gehören.

So rufen Sie gruppierte Daten ab und zeigen einzelne Datensätze an

  1. Legen Sie die ContextTypeName-Eigenschaft und die TableName-Eigenschaft des LinqDataSource-Steuerelements fest.

  2. Legen Sie für die GroupBy-Eigenschaft die Spalte oder die Spalten fest, die Sie zum Gruppieren der Daten verwenden möchten.

  3. Legen Sie die Select-Eigenschaft so fest, dass das It-Schlüsselwort und sämtliche benötigten Aggregatfunktionen eingeschlossen werden. Das durch das It-Schlüsselwort dargestellte Objekt muss mit dem As-Schlüsselwort umbenannt werden.

    Im folgenden Beispiel wird ein LinqDataSource-Steuerelement dargestellt, das konfiguriert wurde, um nach zwei Spalten zu gruppieren. Die Key-Eigenschaft verweist auf ein Objekt, das über zwei Eigenschaften verfügt: ProductCategory und Color. Das durch It dargestellte Objekt wird in Products umbenannt. Das umbenannte Products-Objekt enthält eine Auflistung der einzelnen Datensätze in einer Gruppierung. Jede Instanz enthält alle Spalten der Products-Tabelle.

    <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>
    

    Das folgende Beispiel zeigt zwei ListView-Steuerelemente, die die gruppierten Daten sowie die einzelnen Produktnamen anzeigen, die zu dieser Gruppe gehören. Die verschachtelte datengebundene DataSource-Eigenschaft des Steuerelements ist auf Products festgelegt, dem Alias für das it-Objekt.

    <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>
    

Siehe auch

Konzepte

Übersicht über das LinqDataSource-Webserversteuerelement