Partilhar via


Cláusula agregada (Visual Basic)

Aplica uma ou mais funções agregadas a uma coleção.

Sintaxe

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

Partes

Termo Definição
element Obrigatório. Variável usada para iterar através dos elementos da coleção.
type Opcional. O tipo de element. Se nenhum tipo for especificado, o tipo de element é inferido de collection.
collection Obrigatório. Refere-se à coleção para operar.
clause Opcional. Uma ou mais cláusulas de consulta, como uma Where cláusula, para refinar o resultado da consulta para aplicar a cláusula ou cláusulas agregadas.
expressionList Obrigatório. Uma ou mais expressões delimitadas por vírgulas que identificam uma função agregada a ser aplicada à coleção. Você pode aplicar um alias a uma função agregada para especificar um nome de membro para o resultado da consulta. Se nenhum alias for fornecido, o nome da função agregada será usado. Para obter exemplos, consulte a seção sobre funções agregadas mais adiante neste tópico.

Observações

A Aggregate cláusula pode ser usada para incluir funções agregadas em suas consultas. As funções agregadas executam verificações e cálculos sobre um conjunto de valores e retornam um único valor. Você pode acessar o valor computado usando um membro do tipo de resultado da consulta. As funções de agregação padrão que você pode usar são as Allfunções , Any, Average, Count, LongCount, MaxMin, e Sum . Essas funções são familiares para desenvolvedores que estão familiarizados com agregações em SQL. Eles são descritos na seção a seguir deste tópico.

O resultado de uma função agregada é incluído no resultado da consulta como um campo do tipo de resultado da consulta. Você pode fornecer um alias para o resultado da função agregada para especificar o nome do membro do tipo de resultado da consulta que manterá o valor agregado. Se nenhum alias for fornecido, o nome da função agregada será usado.

A Aggregate cláusula pode iniciar uma consulta ou pode ser incluída como uma cláusula adicional em uma consulta. Se a Aggregate cláusula iniciar uma consulta, o resultado será um único valor que é o resultado da função de agregação especificada na Into cláusula. Se mais de uma função de agregação for especificada na Into cláusula, a consulta retornará um único tipo com uma propriedade separada para fazer referência ao resultado de cada função de agregação na Into cláusula. Se a Aggregate cláusula for incluída como uma cláusula adicional em uma consulta, o tipo retornado na coleção de consultas terá uma propriedade separada para fazer referência ao resultado de cada função agregada na Into cláusula.

Funções de Agregação

A seguir estão as funções agregadas padrão que podem ser usadas com a Aggregate cláusula.

Todos

Retorna true se todos os elementos da coleção satisfizerem uma condição especificada; caso contrário, retorna false. Veja o exemplo seguinte:

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

Qualquer

Retorna true se qualquer elemento da coleção satisfizer uma condição especificada; caso contrário, retorna false. Veja o exemplo seguinte:

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

Média

Calcula a média de todos os elementos da coleção ou calcula uma expressão fornecida para todos os elementos da coleção. Veja o exemplo seguinte:

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

Count

Conta o número de elementos na coleção. Você pode fornecer uma expressão opcional Boolean para contar apenas o número de elementos na coleção que satisfazem uma condição. Veja o exemplo seguinte:

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

Agrupar

Refere-se aos resultados da consulta que são agrupados como resultado de uma Group By cláusula ou Group Join . A Group função é válida apenas na Into cláusula de uma Group By ou Group Join cláusula. Para obter mais informações e exemplos, consulte Cláusula de agrupamento por e Cláusula de associação de grupo.

Contagem Longa

Conta o número de elementos na coleção. Você pode fornecer uma expressão opcional Boolean para contar apenas o número de elementos na coleção que satisfazem uma condição. Devolve o resultado como um Longficheiro . Para obter um exemplo, consulte a Count função de agregação.

Máx

Calcula o valor máximo da coleção ou calcula uma expressão fornecida para todos os elementos da coleção. Veja o exemplo seguinte:

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

Min

Calcula o valor mínimo da coleção ou calcula uma expressão fornecida para todos os elementos da coleção. Veja o exemplo seguinte:

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

Soma

Calcula a soma de todos os elementos da coleção ou calcula uma expressão fornecida para todos os elementos da coleção. Veja o exemplo seguinte:

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

Exemplo

O exemplo a seguir mostra como usar a Aggregate cláusula para aplicar funções agregadas a um resultado de consulta.

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

Criando funções de agregação definidas pelo usuário

Você pode incluir suas próprias funções de agregação personalizadas em uma expressão de consulta adicionando métodos de extensão ao IEnumerable<T> tipo. Seu método personalizado pode então executar um cálculo ou operação na coleção enumerável que fez referência à sua função agregada. Para obter mais informações sobre métodos de extensão, consulte Métodos de extensão.

Por exemplo, o exemplo a seguir mostra uma função de agregação personalizada que calcula o valor mediano de uma coleção de números. Há duas sobrecargas do Median método de extensão. A primeira sobrecarga aceita, como entrada, uma coleção do tipo IEnumerable(Of Double). Se a Median função de agregação for chamada para um campo de consulta do tipo Double, esse método será chamado. A segunda sobrecarga do Median método pode ser passada qualquer tipo genérico. A sobrecarga genérica do Median método usa um segundo parâmetro que faz referência à Func(Of T, Double) expressão lambda para projetar um valor para um tipo (de uma coleção) como o valor correspondente do tipo Double. Em seguida, delega o cálculo do valor mediano à outra sobrecarga do Median método. Para obter mais informações sobre expressões lambda, consulte Expressões lambda.

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

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

        Dim sortedList = From number In values
                         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 values As IEnumerable(Of T),
                          ByVal selector As Func(Of T, Double)) As Double
        Return (From element In values Select selector(element)).Median()
    End Function

End Module

O exemplo a seguir mostra consultas de exemplo que chamam a Median função agregada em uma coleção do tipo Integer, e uma coleção do tipo Double. A consulta que chama a Median função de agregação na coleção de tipo Double chama a sobrecarga do Median método que aceita, como entrada, uma coleção de tipo Double. A consulta que chama a Median função de agregação na coleção de tipo Integer chama a sobrecarga genérica do Median método.

Module Module1

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

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

        Console.WriteLine("Median = " & query1)

        Dim numbers2 = {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

Consulte também