Ejemplos de sintaxis de consulta basada en métodos: Agrupar
Los ejemplos de este tema muestran cómo se utiliza el método GroupBy
para consultar el modelo AdventureWorks Sales utilizando la sintaxis de consulta basada en métodos. El modelo AdventureWorks Sales que se usa en estos ejemplos se crea a partir de las tablas Contact, Address, Product, SalesOrderHeader y SalesOrderDetail de la base de datos de ejemplo AdventureWorks.
Los ejemplos de este tema utilizan las siguientes instrucciones using
/Imports
:
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using System.Globalization;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Data.Common;
Option Explicit On
Option Strict On
Imports System.Data.Objects
Imports System.Globalization
Ejemplo 1
En el ejemplo siguiente se utiliza el método GroupBy
para devolver objetos Address
agrupados por código postal. Los resultados se proyectan en un tipo anónimo.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = context.Addresses
.GroupBy( address => address.PostalCode);
foreach (IGrouping<string, Address> addressGroup in query)
{
Console.WriteLine("Postal Code: {0}", addressGroup.Key);
foreach (Address address in addressGroup)
{
Console.WriteLine("\t" + address.AddressLine1 +
address.AddressLine2);
}
}
}
Using context As New AdventureWorksEntities
Dim query = context.Addresses _
.GroupBy(Function(Address) Address.PostalCode) _
.Select(Function(Address) Address)
For Each addressGroup As IGrouping(Of String, Address) In query
Console.WriteLine("Postal Code: {0}", addressGroup.Key)
For Each address As Address In addressGroup
Console.WriteLine(" " + address.AddressLine1 + address.AddressLine2)
Next
Next
End Using
Ejemplo 2
En el ejemplo siguiente se utiliza el método GroupBy
para devolver objetos Contact
agrupados por la primera letra del apellido del contacto. Los resultados se ordenan también por la primera letra del apellido y se proyectan en un tipo anónimo.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = context.Contacts
.GroupBy(c => c.LastName.Substring(0,1))
.OrderBy(c => c.Key);
foreach (IGrouping<string, Contact> group in query)
{
Console.WriteLine("Last names that start with the letter '{0}':",
group.Key);
foreach (Contact contact in group)
{
Console.WriteLine(contact.LastName);
}
}
}
Using context As New AdventureWorksEntities
Dim query = context.Contacts _
.GroupBy(Function(c) c.LastName.Substring(0, 1)) _
.OrderBy(Function(c) c.Key) _
.Select(Function(c) c)
For Each group As IGrouping(Of String, Contact) In query
Console.WriteLine("Last names that start with the letter '{0}':", group.Key)
For Each contact As Contact In group
Console.WriteLine(contact.LastName)
Next
Next
End Using
Ejemplo 3
En el ejemplo siguiente se utiliza el método GroupBy
para devolver objetos SalesOrderHeader
agrupados por identificador de cliente. También se devuelve el número de ventas para cada cliente.
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var query = context.SalesOrderHeaders
.GroupBy(order => order.CustomerID);
foreach (IGrouping<int, SalesOrderHeader> group in query)
{
Console.WriteLine("Customer ID: {0}", group.Key);
Console.WriteLine("Order count: {0}", group.Count());
foreach (SalesOrderHeader sale in group)
{
Console.WriteLine(" Sale ID: {0}", sale.SalesOrderID);
}
Console.WriteLine("");
}
}
Using context As New AdventureWorksEntities
Dim query = context.SalesOrderHeaders _
.GroupBy(Function(order) order.CustomerID)
' Iterate over each IGrouping
For Each group In query
Console.WriteLine("Customer ID: {0}", group.Key)
Console.WriteLine("Order Count: {0}", group.Count)
For Each sale In group
Console.WriteLine(" Sale ID: {0}", sale.SalesOrderID)
Next
Console.WriteLine("")
Next
End Using