メソッド ベースのクエリ構文例: 集計演算子 (LINQ to Entities)
このトピックでは、メソッド ベースのクエリ構文で、Aggregate、Average、Count、LongCount、Max、Min、Sum の各メソッドを使用して、AdventureWorks Sales Model を照会する例を取り上げます。 The AdventureWorks Sales Model used in these examples is built from the Contact, Address, Product, SalesOrderHeader, and SalesOrderDetail tables in the AdventureWorks sample database.
このトピックの例には、次の using/Imports ステートメントが使用されています。
Option Explicit On
Option Strict On
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 System.Globalization;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Data.Common;
Average
例
次の例では、Average メソッドを使用して、製品の平均表示価格を取得します。
Using context As New AdventureWorksEntities
Dim products As ObjectSet(Of Product) = context.Products
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 context = new AdventureWorksEntities())
{
ObjectSet<Product> products = context.Products;
Decimal averageListPrice =
products.Average(product => product.ListPrice);
Console.WriteLine("The average list price of all the products is ${0}",
averageListPrice);
}
例
次の例では、Average メソッドを使用して、各スタイルの製品の平均表示価格を取得します。
Using context As New AdventureWorksEntities
Dim products As ObjectSet(Of Product) = context.Products
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 context = new AdventureWorksEntities())
{
ObjectSet<Product> products = context.Products;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
Dim averageTotalDue As Decimal = _
orders.Average(Function(ord) ord.TotalDue)
Console.WriteLine("The average TotalDue is {0}.", averageTotalDue)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
Decimal averageTotalDue = orders.Average(order => order.TotalDue);
Console.WriteLine("The average TotalDue is {0}.", averageTotalDue);
}
例
次の例では、Average メソッドを使用して、それぞれの連絡先 ID について平均合計支払額を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim products As ObjectSet(Of Product) = context.Products
Dim numProducts As Integer = products.Count()
Console.WriteLine("There are {0} products.", numProducts)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<Product> products = context.Products;
int numProducts = products.Count();
Console.WriteLine("There are {0} products.", numProducts);
}
例
次の例では、Count メソッドを使用して、連絡先 ID の一覧と、それぞれの注文数を返します。
Using context As New AdventureWorksEntities
Dim contacts As ObjectSet(Of Contact) = context.Contacts
Dim query = _
From cont In contacts _
Select New With _
{ _
.CustomerID = cont.ContactID, _
.OrderCount = cont.SalesOrderHeaders.Count() _
}
For Each cont In query
Console.WriteLine("CustomerID = {0} OrderCount = {1}", _
cont.CustomerID, cont.OrderCount)
Next
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<Contact> contacts = context.Contacts;
//Can't find field SalesOrderContact
var query =
from contact in contacts
select new
{
CustomerID = contact.ContactID,
OrderCount = contact.SalesOrderHeaders.Count()
};
foreach (var contact in query)
{
Console.WriteLine("CustomerID = {0} \t OrderCount = {1}",
contact.CustomerID,
contact.OrderCount);
}
}
例
次の例では、製品を色でグループ分けし、Count メソッドを使用してそれぞれの色グループに含まれる製品の数を返します。
Using context As New AdventureWorksEntities
Dim products As ObjectSet(Of Product) = context.Products
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 context = new AdventureWorksEntities())
{
ObjectSet<Product> products = context.Products;
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
例
次の例では、連絡先の数を長整数として取得します。
Using context As New AdventureWorksEntities
Dim contacts As ObjectSet(Of Contact) = context.Contacts
Dim numberOfContacts As Long = contacts.LongCount()
Console.WriteLine("There are {0} Contacts", numberOfContacts)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<Contact> contacts = context.Contacts;
long numberOfContacts = contacts.LongCount();
Console.WriteLine("There are {0} Contacts", numberOfContacts);
}
Max
例
次の例では、Max メソッドを使用して、最大合計支払額を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
Dim maxTotalDue As Decimal = _
orders.Max(Function(ord) ord.TotalDue)
Console.WriteLine("The maximum TotalDue is {0}.", maxTotalDue)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
Decimal maxTotalDue = orders.Max(w => w.TotalDue);
Console.WriteLine("The maximum TotalDue is {0}.",
maxTotalDue);
}
例
次の例では、Max メソッドを使用して、それぞれの連絡先 ID について最大合計支払額を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
Dim smallestTotalDue As Decimal = _
orders.Min(Function(totDue) totDue.TotalDue)
Console.WriteLine("The smallest TotalDue is {0}.", _
smallestTotalDue)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
Decimal smallestTotalDue = orders.Min(totalDue => totalDue.TotalDue);
Console.WriteLine("The smallest TotalDue is {0}.",
smallestTotalDue);
}
例
次の例では、Min メソッドを使用して、それぞれの連絡先 ID について最小合計支払額を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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 context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderDetail) = context.SalesOrderDetails
Dim totalOrderQty As Double = orders.Sum(Function(o) o.OrderQty)
Console.WriteLine("There are a total of {0} OrderQty.", _
totalOrderQty)
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderDetail> orders = context.SalesOrderDetails;
double totalOrderQty = orders.Sum(o => o.OrderQty);
Console.WriteLine("There are a total of {0} OrderQty.",
totalOrderQty);
}
例
次の例では、Sum メソッドを使用して、それぞれの連絡先 ID について合計支払額を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
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 context = new AdventureWorksEntities())
{
ObjectSet<SalesOrderHeader> orders = context.SalesOrderHeaders;
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);
}
}