跨關聯性查詢

對類別定義中其他物件或其他物件集合的參考,會直接對應到資料庫中的外部索引鍵關聯性。 您可以在使用點標記法進行查詢時使用這些關聯性,進而存取關聯性屬性以及從某個物件巡覽到另一個物件。 這些存取作業會轉譯成對等 SQL 中更複雜的聯結或相關聯的子查詢 (Subquery)。

例如,下列查詢會從訂單巡覽至客戶,而將查詢結果限制在位於倫敦 (London) 之客戶的訂單。

        Northwnd db = new Northwnd(@"northwnd.mdf");

        IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord

如果關聯性屬性不存在,您就必須以手動方式將這些屬性撰寫為「聯結」,就像您在 SQL 查詢中所做的一樣,如下列程式碼所示:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        IQueryable<Order> londonOrderQuery =
from cust in db.Customers
join ord in db.Orders on cust.CustomerID equals ord.CustomerID
where cust.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londOrderQuery = _
From cust In db.Customers _
Join ord In db.Orders On cust.CustomerID Equals ord.CustomerID _
Select ord

您可以使用「關聯性」屬性,定義一次這種特殊關聯性。 然後,您就可以使用更為方便的點語法。 但是關聯性屬性的存在更加重要,因為網域指定的物件模型 (Object Model) 通常會定義為階層架構或圖形。 您進行程式設計的物件會具有對其他物件的參考。 物件對物件的關聯性會對應到資料庫中的外部索引鍵樣式關聯性,只是純屬巧合。 屬性存取則提供了撰寫聯結的簡便方法。

關於這點,相較於成為查詢本身的一部分,關聯性屬性對於查詢的結果而言更加重要。 在查詢已擷取特定客戶的相關資料後,類別定義會表示客戶具有訂單。 換句話說,您會預期特定客戶的 Orders 屬性成為已填入 (Populate) 該客戶所有訂單的集合。 事實上,這就是您透過這種方式定義類別而宣告的合約。 即使查詢並未要求訂單,您仍預期會在此看見訂單。 您期望物件模型能維持某種假象,那就是資料庫的記憶體中擴充具有立即可用的相關物件。

您目前具有關聯性,因此可藉由參考類別中定義的關聯性屬性,進而撰寫查詢。 這些關聯性參考會對應至資料庫中的外部索引鍵關聯性。 使用這些關聯性的作業會轉譯成對等 SQL 中更複雜的聯結。 只要您已定義關聯性 (使用 AssociationAttribute 屬性),就不必在 LINQ to SQL 中編寫明確聯結。

為了要協助維持此假象,LINQ to SQL 會實作一種稱為「延後載入」的技術。 如需詳細資訊,請參閱延後載入與立即載入的比較

請考慮下列 SQL 查詢,以規劃 CustomerID-OrderID 組的清單:

SELECT t0.CustomerID, t1.OrderID  
FROM   Customers AS t0 INNER JOIN  
          Orders AS t1 ON t0.CustomerID = t1.CustomerID  
WHERE  (t0.City = @p0)  

若要使用 LINQ to SQL 取得相同的結果,您可使用已存在於 Customer 類別中的 Orders 屬性參考。 Orders 參考提供了執行查詢和規劃 CustomerID-OrderID 組所需的資訊,如下列程式碼所示:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select new { cust.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select cust.CustomerID, ord.OrderID

您也可以進行反轉。 也就是說,您可以查詢 Orders,並使用其 Customer 關聯性參考來存取關聯之 Customer 物件的相關資訊。 下列程式碼會規劃與之前相同的 CustomerID-OrderID 組,但這次是透過查詢 Orders 而非 Customers

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select new { ord.Customer.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord.CustomerID, ord.OrderID

另請參閱