實體資料模型 中的導覽屬性是用來尋找位於關聯兩端之實體的捷徑屬性。導覽屬性可讓使用者在不同實體之間巡覽,或是透過關聯集從某個實體巡覽至相關的實體。導覽屬性可以在 實體 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 查詢中的運算式