本主题中的示例演示如何使用 GroupBy 方法,利用基于方法的查询语法来查询 AdventureWorks 销售模型。这些示例中使用的 AdventureWorks 销售模型基于 AdventureWorks 示例数据库中的 Contact、Address、Product、SalesOrderHeader 和 SalesOrderDetail 表生成。
本主题中的示例使用下面的 using/Imports 语句:
Option Explicit On
Option Strict On
Imports L2EExamplesVB.AdventureWorksModel
Imports System.Data.Objects
Imports System.Globalization
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using AdventureWorksModel;
using System.Globalization;
有关更多信息,请参见如何:在 Visual Studio 中创建 LINQ to Entities 项目。
示例
下面的示例使用 GroupBy 方法来返回按邮政编码分组的 Address 对象。这些结果将投影到一个匿名类型。
Using AWEntities As New AdventureWorksEntities
    Dim query = AWEntities.Address _
        .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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    var query = AWEntities.Address
        .GroupBy( address => address.PostalCode)
        .Select( address => address);                     
        
    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);
        }
    }
}
示例
下面的示例使用 GroupBy 方法来返回按联系人姓氏的首字母分组的 Contact 对象。这些结果还按姓氏的首字母进行排序,并投影到一个匿名类型。
Using AWEntities As New AdventureWorksEntities
    Dim query = AWEntities.Contact _
    .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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    var query = AWEntities.Contact
        .GroupBy(c => c.LastName.Substring(0,1))
        .OrderBy(c => c.Key)
        .Select(c => c);
    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);
        }
        
    }
}
示例
下面的示例使用 GroupBy 方法来返回按客户 ID 分组的 SalesOrderHeader 对象。同时还返回每个客户的销售数量。
Using AWEntities As New AdventureWorksEntities
    Dim query = AWEntities.SalesOrderHeader _
        .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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    var query = AWEntities.SalesOrderHeader
        .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("");                    
    }
}