Partager via


Aggregate, clause (Visual Basic)

Mise à jour : novembre 2007

Applique une ou plusieurs fonctions d'agrégation à une collection.

Aggregate element [As type] In collection _
    [, element2 [As type2] In collection2, [...]]
  [ clause ]
    Into expressionList

Éléments

  • element
    Obligatoire. Variable utilisée pour parcourir les éléments de la collection.

  • type
    Facultatif. Type d'element. Si aucun type n'est spécifié, le type d'element est déduit de collection.

  • collection
    Obligatoire. Fait référence à la collection sur laquelle opérer.

  • clause
    Facultatif. Une ou plusieurs clauses de requête, telles qu'une clause Where, pour affiner le résultat de la requête auquel appliquer la ou les clauses d'agrégation.

  • expressionList
    Obligatoire. Une ou plusieurs expressions délimitées par des virgules qui identifient une fonction d'agrégation à appliquer à la collection. Vous pouvez appliquer un alias à une fonction d'agrégation pour spécifier un nom de membre pour le résultat de la requête. Si aucun alias n'est fourni, le nom de la fonction d'agrégation est utilisé. Pour obtenir des exemples, consultez la section sur les fonctions d'agrégation plus loin dans cette rubrique.

Notes

La clause Aggregate peut être utilisée pour inclure des fonctions d'agrégation dans vos requêtes. Les fonctions d'agrégation effectuent des vérifications et des calculs sur un jeu de valeurs et retournent une valeur unique. Vous pouvez accéder à la valeur calculée à l'aide d'un membre du type du résultat de la requête. Les fonctions d'agrégation standard que vous pouvez utiliser sont les suivantes : All, Any, Average, Count, LongCount, Max, Minet Sum. Ces fonctions sont connues des développeurs qui sont familiarisés avec les agrégats dans SQL. Ils sont décrits dans la section suivante de cette rubrique.

Le résultat d'une fonction d'agrégation est inclus dans le résultat de la requête sous la forme d'un champ du type de résultat de requête. Vous pouvez fournir un alias pour le résultat de la fonction d'agrégation pour spécifier le nom du membre du type de résultat de la requête qui maintiendra la valeur d'agrégation. Si aucun alias n'est fourni, le nom de la fonction d'agrégation est utilisé.

La clause Aggregate peut commencer une requête ou être incluse comme clause supplémentaire dans une requête. Si la clause Aggregate commence une requête, il en résulte une valeur unique qui est le résultat de la fonction d'agrégation spécifiée dans la clause Into. Si plusieurs fonctions d'agrégation sont spécifiées dans la clause Into, la requête retourne un type unique avec une propriété séparée pour référencer le résultat de chaque fonction d'agrégation de la clause Into. Si la clause Aggregate est incluse comme clause supplémentaire dans une requête, le type retourné dans la collection de requêtes aura une propriété distincte pour référencer le résultat de chaque fonction d'agrégation de la clause Into.

Fonctions d'agrégation

La liste suivante décrit les fonctions d'agrégation standard qui peuvent être utilisées avec la clause Aggregate.

  • All
    Retourne la valeur true si tous les éléments de la collection satisfont une condition spécifiée ; sinon retourne la valeur false. Voici un exemple :

    Dim customerList1 = Aggregate order In orders _
                        Into AllOrdersOver100 = All(order.Total >= 100)
    
  • Any
    Retourne la valeur true si un élément de la collection satisfait une condition spécifiée ; sinon retourne la valeur false. Voici un exemple :

    Dim customerList2 = From cust In customers _
                        Aggregate order In cust.Orders _
                        Into AnyOrderOver500 = Any(order.Total >= 500)
    
  • Average
    Calcule la moyenne de tous les éléments de la collection ou une expression fournie pour tous les éléments de la collection. Voici un exemple :

    Dim customerOrderAverage = Aggregate order In orders _
                               Into Average(order.Total)
    
  • Count
    Compte le nombre d'éléments de la collection. Vous pouvez fournir une expression Boolean facultative pour compter uniquement le nombre d'éléments de la collection qui satisfont une condition. Voici un exemple :

    Dim customerOrderAfter1996 = From cust In customers _
                                 Aggregate order In cust.Orders _
                                 Into Count(order.OrderDate > #12/31/1996#)
    
  • Group
    Fait référence aux résultats de la requête groupés suite à une clause Group By ou Group Join. La fonction Group est valide uniquement dans la clause Into d'une clause Group By ou Group Join. Pour plus d'informations et d'exemples, consultez Group By, clause (Visual Basic) et Group Join, clause (Visual Basic).

  • LongCount
    Compte le nombre d'éléments de la collection. Vous pouvez fournir une expression Boolean facultative pour compter uniquement le nombre d'éléments de la collection qui satisfont une condition. Retourne le résultat sous la forme de Long. Pour obtenir un exemple, consultez la fonction d'agrégation Count.

  • Max
    Calcule la valeur maximale de la collection ou une expression fournie pour tous ses éléments. Voici un exemple :

    Dim customerMaxOrder = Aggregate order In orders _
                           Into MaxOrder = Max(order.Total)
    
  • Min
    Calcule la valeur minimale de la collection ou une expression fournie pour tous ses éléments. Voici un exemple :

    Dim customerMinOrder = From cust In customers _
                           Aggregate order In cust.Orders _
                           Into MinOrder = Min(order.Total)
    
  • Sum
    Calcule la somme de tous les éléments de la collection ou une expression fournie pour tous les éléments de la collection. Voici un exemple :

    Dim customerTotals = From cust In customers _
                         Aggregate order In cust.Orders _
                         Into Sum(order.Total)
    

Exemple

L'exemple de code suivant indique comment utiliser la clause Aggregate pour appliquer des fonctions d'agrégation à un résultat de requête.

Public Sub AggregateSample()
  Dim customers = GetCustomerList()

  Dim customerOrderTotal = _
      From cust In customers _
      Aggregate order In cust.Orders _
      Into Sum(order.Total), MaxOrder = Max(order.Total), _
      MinOrder = Min(order.Total), Avg = Average(order.Total)

  For Each customer In customerOrderTotal
    Console.WriteLine(customer.cust.CompanyName & vbCrLf & _
                     vbTab & "Sum = " & customer.Sum & vbCrLf & _
                     vbTab & "Min = " & customer.MinOrder & vbCrLf & _
                     vbTab & "Max = " & customer.MaxOrder & vbCrLf & _
                     vbTab & "Avg = " & customer.Avg.ToString("#.##"))
  Next
End Sub

Création de fonctions d'agrégation définies par l'utilisateur

Vous pouvez inclure vos propres fonctions d'agrégation personnalisées dans une expression de requête en ajoutant des méthodes d'extension au type IEnumerable<T>. Votre méthode personnalisée peut ensuite effectuer un calcul ou une opération sur la collection dénombrable qui a référencé votre fonction d'agrégation. Pour plus d'informations sur les méthodes d'extension, consultez Méthodes d'extension (Visual Basic).

Par exemple, l'exemple de code suivant représente une fonction d'agrégation personnalisée qui calcule la valeur médiane d'une collection de nombres. Il y a deux surcharges de la méthode d'extension Median. La première surcharge accepte, comme entrée, une collection de type IEnumerable(Of Double). Si la fonction d'agrégation Median est appelée pour un champ de requête de type Double, cette méthode sera appelée. La deuxième méthode de surcharge Median peut être passée à tout type générique. La surcharge générique de la méthode Median prend un deuxième paramètre qui référence l'expression lambda Func(Of T, Double) pour projeter une valeur pour un type (d'une collection) comme valeur correspondante de type Double. Il délègue alors le calcul de la valeur médiane à l'autre surcharge de la méthode Median. Pour plus d'informations sur les expressions lambda, consultez Expressions lambda.

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

  ' Calculate the median value for a collection of type Double.
  <Extension()> _
  Function Median(ByVal medianAggregate As IEnumerable(Of Double)) As Double
    If medianAggregate.Count = 0 Then
      Throw New InvalidOperationException("Cannot compute median for an empty set.")
    End If

    Dim sortedList = From number In medianAggregate Order By number

    Dim medianValue As Double

    Dim itemIndex = CInt(Int(sortedList.Count / 2))

    If sortedList.Count Mod 2 = 0 Then    
      ' Even number of items in list.
      medianValue = ((sortedList(itemIndex) + sortedList(itemIndex - 1)) / 2)
    Else                                  
     ' Odd number of items in list.
      medianValue = sortedList(itemIndex)
    End If

    Return medianValue
  End Function

  ' "Cast" the collection of generic items as type Double and call the 
  ' Median() method to calculate the median value.
  <Extension()> _
  Function Median(Of T)(ByVal medianAggregate As IEnumerable(Of T), _
                        ByVal selector As Func(Of T, Double)) As Double
    Return (From element In medianAggregate Select selector(element)).Median()
  End Function

End Module

L'exemple de code suivant illustre des requêtes d'exemple qui appellent la fonction d'agrégation Median sur une collection de type Integer et de type Double. La requête qui appelle la fonction d'agrégation Median sur la collection de type Double appelle la surcharge de la méthode Median qui accepte, comme entrée, une collection de type Double. La requête qui appelle la fonction d'agrégation Median sur la collection de type Integer appelle la surcharge générique de la méthode Median.

Module Module1

  Sub Main()
    Dim numbers1 As Integer() = New Integer() {1, 2, 3, 4, 5}

    Dim query1 = Aggregate num In numbers1 Into Median(num)

    Console.WriteLine("Median = " & query1)

    Dim numbers2 As Double() = New Double() {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

    Dim query2 = Aggregate num In numbers2 Into Median()

    Console.WriteLine("Median = " & query2)
  End Sub

End Module

Voir aussi

Concepts

Introduction à LINQ dans Visual Basic

Référence

Select, clause (Visual Basic)

From, clause (Visual Basic)

Where, clause (Visual Basic)

Group By, clause (Visual Basic)

Autres ressources

Requêtes (Visual Basic)