メソッド ベースのクエリ構文例 : リレーションシップのナビゲーション (LINQ to Entities)
Navigation properties in the Entity Framework are shortcut properties used to locate the entities at the ends of an association. ナビゲーション プロパティを使用すると、ユーザーは、エンティティ間をナビゲートしたり、あるエンティティからアソシエーション セットを介して関連エンティティにナビゲートしたりできます。 このトピックでは、LINQ to Entities クエリ内でナビゲーション プロパティを介してリレーションシップをナビゲートするためのメソッド ベースのクエリ構文の例を示します。
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;
例
次の例では、メソッドベースのクエリ構文で SelectMany メソッドを使用して、姓が "Zhou" である連絡先のすべての注文を取得します。 Contact.SalesOrderHeader ナビゲーション プロパティは、各連絡先の SalesOrderHeader オブジェクトのコレクションを取得するために使用されます。
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.SelectMany(Function(o) o.SalesOrderHeaders)
For Each order In ordersQuery
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
order.SalesOrderID, order.OrderDate, order.TotalDue)
Next
End Using
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.SelectMany(c => c.SalesOrderHeaders);
foreach (var order in ordersQuery)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
order.SalesOrderID, order.OrderDate, order.TotalDue);
}
}
例
次の例では、メソッドベースのクエリ構文で Select メソッドを使用して、姓が "Zhou" である連絡先のすべての連絡先 ID と、各連絡先の合計支払額の総計を取得します。 Contact.SalesOrderHeader ナビゲーション プロパティは、各連絡先の SalesOrderHeader オブジェクトのコレクションを取得するために使用されます。 Sum メソッドは、Contact.SalesOrderHeader ナビゲーション プロパティを使用して、それぞれの連絡先のすべての注文の合計支払額を合計します。
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.Select(Function(c) New With _
{.ContactID = c.ContactID, _
.Total = c.SalesOrderHeaders.Sum(Function(o) o.TotalDue)})
For Each order In ordersQuery
Console.WriteLine("Contact ID: {0} Orders total: {1}", order.ContactID, order.Total)
Next
End Using
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.Select(c => new
{
ContactID = c.ContactID,
Total = c.SalesOrderHeaders.Sum(o => o.TotalDue)
});
foreach (var contact in ordersQuery)
{
Console.WriteLine("Contact ID: {0} Orders total: {1}", contact.ContactID, contact.Total);
}
}
例
次の例では、メソッド ベースのクエリ構文を使用し、姓が "Zhou" である連絡先のすべての注文を取得します。 Contact.SalesOrderHeader ナビゲーション プロパティは、各連絡先の SalesOrderHeader オブジェクトのコレクションを取得するために使用されます。 連絡先の名前と注文が匿名型で返されます。
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.Select(Function(o) New With _
{.LastName = o.LastName, _
.Orders = o.SalesOrderHeaders})
For Each order In ordersQuery
Console.WriteLine("Name: {0}", order.LastName)
For Each orderInfo In order.Orders
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue)
Next
Console.WriteLine("")
Next
End Using
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.Select(c => new { LastName = c.LastName, Orders = c.SalesOrderHeaders });
foreach (var order in ordersQuery)
{
Console.WriteLine("Name: {0}", order.LastName);
foreach (SalesOrderHeader orderInfo in order.Orders)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
orderInfo.SalesOrderID, orderInfo.OrderDate, orderInfo.TotalDue);
}
Console.WriteLine("");
}
}
例
次の例では、SalesOrderHeader.Address ナビゲーション プロパティと SalesOrderHeader.Contact ナビゲーション プロパティを使用して、互いに関連付けられている Address オブジェクトと Contact オブジェクトのコレクションを取得します。 各注文の連絡先の姓、住所、販売注文番号、および Seattle 市に対する合計支払額が匿名型で返されます。
Dim city = "Seattle"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.SalesOrderHeaders _
.Where(Function(o) o.Address.City = city) _
.Select(Function(o) New With { _
.ContactLastName = o.Contact.LastName, _
.ContactFirstName = o.Contact.FirstName, _
.StreetAddress = o.Address.AddressLine1, _
.OrderNumber = o.SalesOrderNumber, _
.TotalDue = o.TotalDue _
})
For Each orderInfo In ordersQuery
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName)
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress)
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber)
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue)
Console.WriteLine("")
Next
End Using
string city = "Seattle";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
var ordersQuery = context.SalesOrderHeaders
.Where(o => o.Address.City == city)
.Select(o => new
{
ContactLastName = o.Contact.LastName,
ContactFirstName = o.Contact.FirstName,
StreetAddress = o.Address.AddressLine1,
OrderNumber = o.SalesOrderNumber,
TotalDue = o.TotalDue
});
foreach (var orderInfo in ordersQuery)
{
Console.WriteLine("Name: {0}, {1}", orderInfo.ContactLastName, orderInfo.ContactFirstName);
Console.WriteLine("Street address: {0}", orderInfo.StreetAddress);
Console.WriteLine("Order number: {0}", orderInfo.OrderNumber);
Console.WriteLine("Total Due: {0}", orderInfo.TotalDue);
Console.WriteLine("");
}
}
例
次の例では、Where メソッドを使用して、2003 年 12 月 1 日以降に受けた注文を検索します。次に、order.SalesOrderDetail ナビゲーション プロパティを使用して、各注文の詳細を取得します。
Using context As New AdventureWorksEntities
Dim orders As ObjectSet(Of SalesOrderHeader) = context.SalesOrderHeaders
Dim query = _
From order In orders _
Where order.OrderDate >= New DateTime(2003, 12, 1) _
Select order
Console.WriteLine("Orders that were made after December 1, 2003:")
For Each order In query
Console.WriteLine("OrderID {0} Order date: {1:d} ", _
order.SalesOrderID, order.OrderDate)
For Each orderDetail In order.SalesOrderDetails
Console.WriteLine(" Product ID: {0} Unit Price {1}", _
orderDetail.ProductID, orderDetail.UnitPrice)
Next
Next
End Using
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> query =
from order in context.SalesOrderHeaders
where order.OrderDate >= new DateTime(2003, 12, 1)
select order;
Console.WriteLine("Orders that were made after December 1, 2003:");
foreach (SalesOrderHeader order in query)
{
Console.WriteLine("OrderID {0} Order date: {1:d} ",
order.SalesOrderID, order.OrderDate);
foreach (SalesOrderDetail orderDetail in order.SalesOrderDetails)
{
Console.WriteLine(" Product ID: {0} Unit Price {1}",
orderDetail.ProductID, orderDetail.UnitPrice);
}
}
}