共用方式為


導覽屬性

實體資料模型 中的導覽屬性是用來尋找位於關聯兩端之實體的捷徑屬性。導覽屬性可讓使用者在不同實體之間巡覽,或是透過關聯集從某個實體巡覽至相關的實體。導覽屬性可以在 實體 SQL 查詢及 LINQ 到實體 查詢中使用。它們可以讓您存取相關實體,而不用執行 JOIN 作業。如需詳細資訊,請參閱導覽屬性 (EDM)

下列以方法為基礎的查詢語法範例使用 SelectMany 方法來取得姓氏為 "Zhou" 之連絡人的所有訂單。Contact.SalesOrderHeader 導覽屬性是用來取得每一連絡人的 SalesOrderHeader 物件集合。

Using AWEntities As New AdventureWorksEntities
    Dim ordersQuery = AWEntities.Contact _
    .Where(Function(c) c.LastName = "Zhou") _
    .SelectMany(Function(o) o.SalesOrderHeader)

    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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<SalesOrderHeader> ordersQuery = AWEntities.Contact
        .Where(c => c.LastName == "Zhou")
        .SelectMany(c => c.SalesOrderHeader);

    foreach (var order in ordersQuery)
    {
        Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
            order.SalesOrderID, order.OrderDate, order.TotalDue);
    }
}

導覽屬性也會出現在 CLR 的實體執行個體中,讓您能藉由呼叫 Load 方法載入相關實體:在 CLR 中載入實體時,應該在存取實體成員前明確載入導覽屬性。載入這些屬性會避免與資料來源之間非預期的往返。不過 LINQ 到實體 查詢是在資料來源中評估的,因此不需要額外的來回行程,而且此屬性可當做更複雜之導覽運算式的預留位置。

如果連接字串中有設定 MultipleActiveResultSets=True,則可以在 foreach/For Each 迴圈內明確載入導覽屬性。如果連接字串包含 MultipleActiveResultSets=False,則下列範例中的 Load 方法呼叫將會擲回 EntityCommandExecutionException

Using AWEntities As New AdventureWorksEntities()
    Dim contacts = _
        AWEntities.Contact _
        .Where(Function(c) c.LastName = "Johnson") _
        .Select(Function(c) c)

    Try
        For Each contact As Contact In contacts

            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName)

            ' Throws a EntityCommandExecutionException if 
            ' MultipleActiveResultSets is set to False in the 
            ' connection string.
            contact.SalesOrderHeader.Load()

            For Each order As SalesOrderHeader In contact.SalesOrderHeader
                Console.WriteLine("Order ID: {0}", order.SalesOrderID)
            Next

        Next
    Catch ex As EntityCommandExecutionException

        Console.WriteLine(ex.InnerException)
    End Try
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
    IQueryable<Contact> contacts =
            AWEntities.Contact
            .Where(c => c.LastName == "Johnson")
            .Select(c => c);

    try
    {

        foreach (Contact contact in contacts)
        {
            Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName);
            
            // Throws a EntityCommandExecutionException if 
            // MultipleActiveResultSets is set to False in the 
            // connection string.
            contact.SalesOrderHeader.Load();

            foreach (SalesOrderHeader order in contact.SalesOrderHeader)
            {
                Console.WriteLine("Order ID: {0}", order.SalesOrderID);
            }
        }
    }
    catch (EntityCommandExecutionException ex)
    {
        Console.WriteLine(ex.InnerException);
    }
}

另請參閱

概念

以方法為基礎的查詢語法範例:巡覽關聯性 (LINQ to Entities)
LINQ to Entities 查詢中的運算式