共用方式為


跨關聯性查詢 (LINQ to SQL)

更新: November 2007

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

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

    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord
        Northwnd db = new Northwnd(@"northwnd.mdf");

        IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;

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

    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
        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;

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

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

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

為了要協助維持此假象,LINQ to SQL 會實作一種稱為「延後載入」(Deferred Loading) 的技術。如需詳細資訊,請參閱延後和立即載入的比較 (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 組所需的資訊,如下列程式碼所示:

    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
        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 };

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

    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
        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 };

請參閱

其他資源

LINQ to SQL 的查詢概念