메서드 기반 쿼리 구문 예제: 그룹화
이 항목의 예제에서는 GroupBy
메서드를 사용하여 메서드 기반 쿼리 구문으로 AdventureWorks Sales 모델을 쿼리하는 방법을 보여 줍니다. 이 예제에서 사용하는 AdventureWorks Sales 모델에서는 AdventureWorks 샘플 데이터베이스의 Contact, Address, Product, SalesOrderHeader 및 SalesOrderDetail 테이블을 사용합니다.
이 항목의 예제에서는 다음과 같은 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
예 1
다음 예제에서는 GroupBy
메서드를 사용하여 우편 번호별로 그룹화된 Address
개체를 반환합니다. 결과는 익명 형식으로 프로젝션됩니다.
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
예제 2
다음 예제에서는 GroupBy
메서드를 사용하여 연락처 성의 첫 번째 문자로 그룹화된 Contact
개체를 반환합니다. 또한 결과는 성의 첫 번째 문자별로 정렬되며 익명 형식으로 프로젝션됩니다.
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
예 3
다음 예제에서는 GroupBy
메서드를 사용하여 고객 ID별로 그룹화된 SalesOrderHeader
개체를 반환합니다. 또한 고객별 판매 수량도 반환됩니다.
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