메서드 기반 쿼리 구문 예제: 집계 연산자(LINQ to Entities)
이 항목의 예제에서는 Aggregate, Average, Count, LongCount, Max, Min 및 Sum 메서드를 사용하여 메서드 기반 쿼리 구문으로 AdventureWorks Sales 모델을 쿼리하는 방법을 보여 줍니다. 이 예제에서 사용하는 AdventureWorks Sales 모델에서는 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 프로젝트 만들기를 참조하십시오.
Average
예제
다음 예제에서는 Average 메서드를 사용하여 제품의 평균 가격을 검색합니다.
Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product
Dim averageListPrice As Decimal = _
products.Average(Function(prod) prod.ListPrice)
Console.WriteLine("The average list price of all the products is ${0}", _
averageListPrice)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Product> products = AWEntities.Product;
Decimal averageListPrice =
products.Average(product => product.ListPrice);
Console.WriteLine("The average list price of all the products is ${0}",
averageListPrice);
}
예제
다음 예제에서는 Average 메서드를 사용하여 각 스타일의 평균 제품 가격을 검색합니다.
Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product
Dim query = _
From prod In products _
Let styl = prod.Style _
Group prod By styl Into g = Group _
Select New With _
{ _
.Style = styl, _
.AverageListPrice = g.Average(Function(p) p.ListPrice) _
}
For Each prod In query
Console.WriteLine("Product style: {0} Average list price: {1}", _
prod.Style, prod.AverageListPrice)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Product> products = AWEntities.Product;
var query = from product in products
group product by product.Style into g
select new
{
Style = g.Key,
AverageListPrice =
g.Average(product => product.ListPrice)
};
foreach (var product in query)
{
Console.WriteLine("Product style: {0} Average list price: {1}",
product.Style, product.AverageListPrice);
}
}
예제
다음 예제에서는 Average 메서드를 사용하여 평균 합계를 검색합니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim averageTotalDue As Decimal = _
orders.Average(Function(ord) ord.TotalDue)
Console.WriteLine("The average TotalDue is {0}.", averageTotalDue)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
Decimal averageTotalDue = orders.Average(order => order.TotalDue);
Console.WriteLine("The average TotalDue is {0}.", averageTotalDue);
}
예제
다음 예제에서는 Average 메서드를 사용하여 각 연락처 ID의 평균 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Select New With _
{ _
.Category = contID, _
.averageTotalDue = _
g.Average(Function(ord) ord.TotalDue) _
}
For Each ord In query
Console.WriteLine("ContactID = {0} " & vbTab & _
" Average TotalDue = {1}", _
ord.Category, ord.averageTotalDue)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
select new
{
Category = g.Key,
averageTotalDue = g.Average(order => order.TotalDue)
};
foreach (var order in query)
{
Console.WriteLine("ContactID = {0} \t Average TotalDue = {1}",
order.Category, order.averageTotalDue);
}
}
예제
다음 예제에서는 Average 메서드를 사용하여 각 연락처에 대해 평균 합계를 가진 주문을 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Let averageTotalDue = g.Average(Function(ord) ord.TotalDue) _
Select New With _
{ _
.Category = contID, _
.CheapestProducts = _
g.Where(Function(ord) ord.TotalDue = averageTotalDue) _
}
For Each orderGroup In query
Console.WriteLine("ContactID: {0}", orderGroup.Category)
For Each ord In orderGroup.CheapestProducts
Console.WriteLine("Average total due for SalesOrderID {1} is: {0}", _
ord.TotalDue, ord.SalesOrderID)
Next
Console.Write(vbNewLine)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
let averageTotalDue = g.Average(order => order.TotalDue)
select new
{
Category = g.Key,
CheapestProducts =
g.Where(order => order.TotalDue == averageTotalDue)
};
foreach (var orderGroup in query)
{
Console.WriteLine("ContactID: {0}", orderGroup.Category);
foreach (var order in orderGroup.CheapestProducts)
{
Console.WriteLine("Average total due for SalesOrderID {1} is: {0}",
order.TotalDue, order.SalesOrderID);
}
Console.Write("\n");
}
}
Count
예제
다음 예제에서는 Count 메서드를 사용하여 Product 테이블에 있는 제품 수를 반환합니다.
Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product
Dim numProducts As Integer = products.Count()
Console.WriteLine("There are {0} products.", numProducts)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Product> products = AWEntities.Product;
int numProducts = products.Count();
Console.WriteLine("There are {0} products.", numProducts);
}
예제
다음 예제에서는 Count 메서드를 사용하여 연락처 ID와 각 연락처의 주문 수로 구성된 목록을 반환합니다.
Using AWEntities As New AdventureWorksEntities
Dim contacts As ObjectQuery(Of Contact) = AWEntities.Contact
Dim query = _
From cont In contacts _
Select New With _
{ _
.CustomerID = cont.ContactID, _
.OrderCount = cont.SalesOrderHeader.Count() _
}
For Each cont In query
Console.WriteLine("CustomerID = {0} OrderCount = {1}", _
cont.CustomerID, cont.OrderCount)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Contact> contacts = AWEntities.Contact;
//Can't find field SalesOrderContact
var query =
from contact in contacts
select new
{
CustomerID = contact.ContactID,
OrderCount = contact.SalesOrderHeader.Count()
};
foreach (var contact in query)
{
Console.WriteLine("CustomerID = {0} \t OrderCount = {1}",
contact.CustomerID,
contact.OrderCount);
}
}
예제
다음 예제에서는 색으로 제품을 그룹화한 다음 Count 메서드를 사용하여 각 색 그룹의 제품 수를 반환합니다.
Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product
Dim query = _
From prod In products _
Let pc = prod.Color _
Group prod By pc Into g = Group _
Select New With {.Color = pc, .ProductCount = g.Count()}
For Each prod In query
Console.WriteLine("Color = {0} " & vbTab & " ProductCount = {1}", _
prod.Color, prod.ProductCount)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Product> products = AWEntities.Product;
var query =
from product in products
group product by product.Color into g
select new { Color = g.Key, ProductCount = g.Count() };
foreach (var product in query)
{
Console.WriteLine("Color = {0} \t ProductCount = {1}",
product.Color,
product.ProductCount);
}
}
LongCount
예제
다음 예제에서는 연락처 수를 정수(Long)로 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim contacts As ObjectQuery(Of Contact) = AWEntities.Contact
Dim numberOfContacts As Long = contacts.LongCount()
Console.WriteLine("There are {0} Contacts", numberOfContacts)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Contact> contacts = AWEntities.Contact;
long numberOfContacts = contacts.LongCount();
Console.WriteLine("There are {0} Contacts", numberOfContacts);
}
Max
예제
다음 예제에서는 Max 메서드를 사용하여 최대 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim maxTotalDue As Decimal = _
orders.Max(Function(ord) ord.TotalDue)
Console.WriteLine("The maximum TotalDue is {0}.", maxTotalDue)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
Decimal maxTotalDue = orders.Max(w => w.TotalDue);
Console.WriteLine("The maximum TotalDue is {0}.",
maxTotalDue);
}
예제
다음 예제에서는 Max 메서드를 사용하여 각 연락처 ID의 최대 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Select New With _
{ _
.Category = contID, _
.MaxTotalDue = _
g.Max(Function(ord) ord.TotalDue) _
}
For Each ord In query
Console.WriteLine("ContactID = {0} " & vbTab & _
" Maximum TotalDue = {1}", _
ord.Category, ord.MaxTotalDue)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
select new
{
Category = g.Key,
maxTotalDue =
g.Max(order => order.TotalDue)
};
foreach (var order in query)
{
Console.WriteLine("ContactID = {0} \t Maximum TotalDue = {1}",
order.Category, order.maxTotalDue);
}
}
예제
다음 예제에서는 Max 메서드를 사용하여 각 연락처 ID에 대해 최대 합계를 가진 주문을 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Let maxTotalDue = g.Max(Function(ord) ord.TotalDue) _
Select New With _
{ _
.Category = contID, _
.CheapestProducts = _
g.Where(Function(ord) ord.TotalDue = maxTotalDue) _
}
For Each orderGroup In query
Console.WriteLine("ContactID: {0}", orderGroup.Category)
For Each ord In orderGroup.CheapestProducts
Console.WriteLine("MaxTotalDue {0} for SalesOrderID {1}: ", _
ord.TotalDue, ord.SalesOrderID)
Next
Console.Write(vbNewLine)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
let maxTotalDue = g.Max(order => order.TotalDue)
select new
{
Category = g.Key,
CheapestProducts =
g.Where(order => order.TotalDue == maxTotalDue)
};
foreach (var orderGroup in query)
{
Console.WriteLine("ContactID: {0}", orderGroup.Category);
foreach (var order in orderGroup.CheapestProducts)
{
Console.WriteLine("MaxTotalDue {0} for SalesOrderID {1}: ",
order.TotalDue,
order.SalesOrderID);
}
Console.Write("\n");
}
}
Min
예제
다음 예제에서는 Min 메서드를 사용하여 최소 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim smallestTotalDue As Decimal = _
orders.Min(Function(totDue) totDue.TotalDue)
Console.WriteLine("The smallest TotalDue is {0}.", _
smallestTotalDue)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
Decimal smallestTotalDue = orders.Min(totalDue => totalDue.TotalDue);
Console.WriteLine("The smallest TotalDue is {0}.",
smallestTotalDue);
}
예제
다음 예제에서는 Min 메서드를 사용하여 각 연락처 ID의 최소 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Select New With _
{ _
.Category = contID, _
.smallestTotalDue = _
g.Min(Function(o) o.TotalDue) _
}
For Each ord In query
Console.WriteLine("ContactID = {0} " & vbTab & _
" Minimum TotalDue = {1}", ord.Category, ord.smallestTotalDue)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
select new
{
Category = g.Key,
smallestTotalDue =
g.Min(order => order.TotalDue)
};
foreach (var order in query)
{
Console.WriteLine("ContactID = {0} \t Minimum TotalDue = {1}",
order.Category, order.smallestTotalDue);
}
}
예제
다음 예제에서는 Min 메서드를 사용하여 각 연락처에 대해 최소 합계를 가진 주문을 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Let minTotalDue = g.Min(Function(o) o.TotalDue) _
Select New With _
{ _
.Category = contID, _
.smallestTotalDue = _
g.Where(Function(o) o.TotalDue = minTotalDue) _
}
For Each orderGroup In query
Console.WriteLine("ContactID: {0}", orderGroup.Category)
For Each ord In orderGroup.smallestTotalDue
Console.WriteLine("Mininum TotalDue {0} for SalesOrderID {1}: ", _
ord.TotalDue, ord.SalesOrderID)
Next
Console.Write(vbNewLine)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
let minTotalDue = g.Min(order => order.TotalDue)
select new
{
Category = g.Key,
smallestTotalDue =
g.Where(order => order.TotalDue == minTotalDue)
};
foreach (var orderGroup in query)
{
Console.WriteLine("ContactID: {0}", orderGroup.Category);
foreach (var order in orderGroup.smallestTotalDue)
{
Console.WriteLine("Mininum TotalDue {0} for SalesOrderID {1}: ",
order.TotalDue,
order.SalesOrderID);
}
Console.Write("\n");
}
}
Sum
예제
다음 예제에서는 Sum 메서드를 사용하여 SalesOrderDetail 테이블의 전체 주문 수량을 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderDetail) = AWEntities.SalesOrderDetail
Dim totalOrderQty As Double = orders.Sum(Function(o) o.OrderQty)
Console.WriteLine("There are a total of {0} OrderQty.", _
totalOrderQty)
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderDetail> orders = AWEntities.SalesOrderDetail;
double totalOrderQty = orders.Sum(o => o.OrderQty);
Console.WriteLine("There are a total of {0} OrderQty.",
totalOrderQty);
}
예제
다음 예제에서는 Sum 메서드를 사용하여 각 연락처 ID의 합계를 가져옵니다.
Using AWEntities As New AdventureWorksEntities
Dim orders As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim query = _
From ord In orders _
Let contID = ord.Contact.ContactID _
Group ord By contID Into g = Group _
Select New With _
{ _
.Category = contID, _
.TotalDue = g.Sum(Function(o) o.TotalDue) _
}
For Each ord In query
Console.WriteLine("ContactID = {0} " & vbTab & _
" TotalDue sum = {1}", ord.Category, ord.TotalDue)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> orders = AWEntities.SalesOrderHeader;
var query =
from order in orders
group order by order.Contact.ContactID into g
select new
{
Category = g.Key,
TotalDue = g.Sum(order => order.TotalDue)
};
foreach (var order in query)
{
Console.WriteLine("ContactID = {0} \t TotalDue sum = {1}",
order.Category, order.TotalDue);
}
}