Partager via


Comment : grouper et regrouper des données à l'aide du contrôle LinqDataSource

Mise à jour : novembre 2007

Le contrôle LinqDataSource vous permet de grouper des données d'une source de données par une ou plusieurs colonnes de données. Vous groupez des enregistrements dans une colonne lorsque vous souhaitez récupérer des informations à propos de tous les enregistrements d'une source de données qui partagent une valeur dans la colonne groupée. Fréquemment, vous utilisez des fonctions d'agrégation sur les données groupées pour calculer des valeurs telles que une somme, une moyenne ou un décompte.

Pour spécifier les colonnes de données utilisées pour grouper les données, vous définissez la propriété GroupBy du contrôle LinqDataSource. Lorsque vous souhaitez utiliser les fonctions d'agrégation, vous spécifiez également une valeur pour la propriété Select pour définir les fonctions d'agrégation.

Remarque :

Vous ne pouvez pas mettre à jour, insérez, ou supprimez des enregistrements lorsque les données avec lesquelles vous travaillez sont groupées.

Regroupement et agrégation des données par une colonne

Vous pouvez grouper des données basées sur une colonne unique en spécifiant la colonne dans la propriété GroupBy.

Pour grouper et faire un agrégat par une colonne

  1. Affectez à ContextTypeName du contrôle LinqDataSource à une source de données.

  2. Définissez la propriété TableName de l'objet source de données qui contient les données à regrouper.

  3. Affectez comme valeur à la propriété GroupBy la colonne que vous désirez utiliser pour grouper les données.

  4. Définissez propriété Select pour inclure une fonction d'agrégation et la colonne utilisées pour grouper les données.

    La propriété spécifiée dans GroupBy est récupérée à travers un objet nommé Key. Vous devez assigner des noms (alias) aux fonctions d'agrégation en utilisant le mot clé As afin qu'un contrôle lié aux données puisse référencer la propriété créée par la fonction d'agrégation. L'objet LinqDataSourceView déclenche une exception si une fonction d'agrégation n'a pas de nom.

    L'exemple suivant illustre un contrôle LinqDataSource utilisant une colonne nommée ProductCategory pour grouper des données, et affiche les résultats en utilisant un contrôle GridView. Il sélectionne les valeurs ProductCategory via la propriété Key. Il calcule alors la moyenne pour les ListPrice et propriétés Cost pour les produits avec la même valeur ProductCategory. Il retourne également un compte du nombre d'enregistrements pour chaque valeur 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>
    

Regroupement et agrégat par plusieurs colonnes

Pour grouper des données par plusieurs colonnes, vous devez utiliser la fonction new lorsque vous définissez la propriété GroupBy.

Pour grouper par plusieurs colonnes

  1. Définissez les contrôles ContextTypeName et TableName, comme décrit dans la procédure précédente.

  2. Définissez la propriété GroupBy à l'aide de la syntaxe new(column1, column2), où column1 et column2 sont les noms des colonnes que vous souhaitez utiliser pour grouper les données. Vous pouvez fournir autant de colonnes qu'il est nécessaire.

  3. Définissez la propriété Select pour inclure la propriété Key et toutes fonctions d'agrégation dont vous avez besoin.

    L'exemple suivant illustre un contrôle LinqDataSource configuré pour grouper par deux colonnes et afficher le résultat dans un contrôle DataList. L'objet Key contient deux propriétés, ProductCategory et 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>
    

Récupérer des enregistrements individuels lors de groupement de données

Lorsque vous avez groupé des données par une ou plusieurs colonnes, vous pouvez récupérer les enregistrements individuels dans chaque regroupement en utilisant le mot clé It. Ce mot clé représente l'instance actuelle de l'objet de données. Les données retournées incluront à la fois les données groupées et les enregistrements qui appartiennent à un groupe.

Récupérer et afficher les données groupées et les enregistrements individuels

  1. Définissez la propriété ContextTypeName et la propriétéTableName du contrôleLinqDataSource.

  2. Affectez à la propriété GroupBy, la ou les colonnes que vous souhaitez utiliser pour grouper les données.

  3. Définissez la propriété Select pour inclure le mot clé It et toutes fonctions d'agrégation dont vous avez besoin. L'objet représenté par le mot clé It doit être renommé avec le mot clé As.

    L'exemple suivant illustre un contrôle LinqDataSource configuré pour regrouper en deux colonnes. La propriété Key référence un objet qui a deux propriétés, ProductCategory et Color. L'objet représenté par It est renommé Products. L'objet renommé Products contient une collection des enregistrements individuels dans un regroupement. Chaque instance contient toutes les colonnes de la table 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>
    

    L'exemple suivant montre deux contrôles ListView qui affichent les données groupées et le nom individuel des produits qui appartiennent à ce groupe. La propriété DataSource du contrôle lié aux données imbriquées a la valeur Produits, qui est l'alias pour l'objet 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>
    

Voir aussi

Concepts

Vue d'ensemble du contrôle serveur Web LinqDataSource