ナビゲーション プロパティを使用してリレーションシップをナビゲートする方法 (Entity Framework)
このトピックでは、ナビゲーション プロパティを使用してリレーションシップをナビゲートする方法について説明します。詳細については、「ナビゲーション プロパティ (EDM)」を参照してください。この例では、姓が "Zhou" である連絡先のすべての注文を取得します。Contact.SalesOrderHeader ナビゲーション プロパティは、各連絡先の SalesOrderHeader オブジェクトのコレクションを取得するために使用されます。次の各 エンティティ フレームワーク クエリ テクノロジを使って同じことを行う例が紹介されています。
LINQ to Entities
Entity SQL と ObjectQuery<T>
ObjectQuery<T> のクエリ ビルダ メソッド
このトピックの例には、Adventure Works Sales Model が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、エンティティ フレームワーク を使用するようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」および「Entity Data Model を手動で定義する方法 (Entity Framework)」の手順を参照してください。Entity Data Model ウィザードを使用して、AdventureWorks Sales Model を定義することもできます。詳細については、「Entity Data Model ウィザードを使用する方法 (Entity Framework)」を参照してください。
例
これは、LINQ to Entities の例です。
Using AWEntities As New AdventureWorksEntities
Dim contacts As ObjectQuery(Of Contact) = AWEntities.Contact
Dim ordersQuery = From contact In contacts _
Where contact.LastName = "Zhou" _
Select New With _
{.LastName = contact.LastName, _
.Orders = contact.SalesOrderHeader}
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Contact> contacts = AWEntities.Contact;
var ordersQuery = from contact in contacts
where contact.LastName == "Zhou"
select new { LastName = contact.LastName, Orders = contact.SalesOrderHeader };
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("");
}
}
これは、Entity SQL の例です。
Using advWorksContext As New AdventureWorksEntities
Dim esqlQuery As String = "SELECT c.FirstName, c.SalesOrderHeader " & _
" FROM AdventureWorksEntities.Contact AS c where c.LastName = 'Zhou'"
Try
Dim objQuery As New ObjectQuery(Of DbDataRecord)(esqlQuery, advWorksContext)
For Each rec As DbDataRecord In objQuery
' Display contact's first name.
Console.WriteLine("First Name {0}: ", rec.Item(0))
Dim list As List(Of SalesOrderHeader) = DirectCast(rec.Item(1), List(Of SalesOrderHeader))
' Display SalesOrderHeader information
' associated with the contact.
For Each soh As SalesOrderHeader In list
Console.WriteLine(" Order ID: {0}, Order date: {1}, Total Due: {2}", _
soh.SalesOrderID, soh.OrderDate, soh.TotalDue)
Next
Next
Catch ex As EntityException
Console.WriteLine(ex.ToString())
Catch ex As InvalidOperationException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
string esqlQuery = @"SELECT c.FirstName, c.SalesOrderHeader
FROM AdventureWorksEntities.Contact AS c where c.LastName = 'Zhou'";
try
{
foreach (DbDataRecord rec in
new ObjectQuery<DbDataRecord>(esqlQuery, advWorksContext))
{
// Display contact's first name.
Console.WriteLine("First Name {0}: ", rec[0]);
List<SalesOrderHeader> list = rec[1] as List<SalesOrderHeader>;
// Display SalesOrderHeader information
// associated with the contact.
foreach (SalesOrderHeader soh in list)
{
Console.WriteLine(" Order ID: {0}, Order date: {1}, Total Due: {2}",
soh.SalesOrderID, soh.OrderDate, soh.TotalDue);
}
}
}
catch (EntityException ex)
{
Console.WriteLine(ex.ToString());
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
}
これは、クエリ ビルダ メソッドの例です。
Using advWorksContext As New AdventureWorksEntities()
Try
' Define a query that returns a nested
' DbDataRecord for the projection.
Dim query As ObjectQuery(Of DbDataRecord) = _
advWorksContext.Contact.Select("it.FirstName, " _
+ "it.LastName, it.SalesOrderHeader") _
.Where("it.LastName = 'Zhou'")
For Each rec As DbDataRecord In query.Execute(MergeOption.AppendOnly)
' Display contact's first name.
Console.WriteLine("First Name {0}: ", rec(0))
' Display SalesOrderHeader information
' associated with the contact.
For Each soh As SalesOrderHeader In CType(rec(2), List(Of SalesOrderHeader))
Console.WriteLine(" Order ID: {0}, " + _
"Order date: {1}, Total Due: {2}", _
soh.SalesOrderID, soh.OrderDate, soh.TotalDue)
Next
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
try
{
// Define a query that returns a nested
// DbDataRecord for the projection.
ObjectQuery<DbDataRecord> query =
advWorksContext.Contact.Select("it.FirstName, "
+ "it.LastName, it.SalesOrderHeader")
.Where("it.LastName = 'Zhou'");
foreach (DbDataRecord rec in
query.Execute(MergeOption.AppendOnly))
{
// Display contact's first name.
Console.WriteLine("First Name {0}: ", rec[0]);
List<SalesOrderHeader> list = rec[2]
as List<SalesOrderHeader>;
// Display SalesOrderHeader information
// associated with the contact.
foreach (SalesOrderHeader soh in list)
{
Console.WriteLine(" Order ID: {0}, " +
"Order date: {1}, Total Due: {2}",
soh.SalesOrderID, soh.OrderDate, soh.TotalDue);
}
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
参照
処理手順
クエリ パスを使用して結果を構築する方法 (Entity Framework)