ナビゲーション プロパティを使用してリレーションシップをナビゲートする方法 (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)

概念

Entity Data Model のリレーションシップ

その他のリソース

Entity Data Model のクエリ (Entity Framework タスク)