共用方式為


跨關聯性查詢

在您的類別定義中,對其他物件或其他物件集合的參考,直接對應於資料庫中的外鍵關係。 您可以在查詢時使用點表示法來存取關聯性屬性,並從一個物件導航到另一個物件。 這些存取作業會轉譯為對等 SQL 中更複雜的聯結或相互關聯的子查詢。

例如,下列查詢會從訂單巡覽至客戶,以將結果限位於倫敦的客戶訂單。

        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

您可以使用 關聯 性屬性一次定義這個特定關聯性。 接著,您可以使用更方便的點語法。 但是關聯性屬性更為重要,因為領域特定的物件模型通常定義為階層或圖形。 您撰寫的程式所使用的物件會引用其他物件。 只有當物件與物件之間的關係只是剛好符合資料庫中類似外鍵的關聯性時,才是個快樂的巧合。 然後,屬性存取會提供方便的方式來寫入聯結。

對此,關聯性屬性在查詢的結果端比查詢本身更重要。 查詢擷取特定客戶的相關數據之後,類別定義會指出客戶有訂單。 換句話說,你預期 Orders 特定客戶的屬性會是一個包含該客戶所有訂單的集合。 事實上,這是您以此方式定義類別所宣告的合約。 即使查詢未要求訂單,您仍預期會看到該處的訂單。 您預期物件模型會維持其作為資料庫內存延伸的假象,並即時提供相關物件。

既然您已擁有關聯性,您可以藉由參考類別中定義的關聯性屬性來撰寫查詢。 這些關聯參考會對應到資料庫中的外鍵關聯性。 使用這些關聯性的作業會轉化為對應 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 取得相同的結果,您可以使用 Orders 類別中 Customer 已經存在的屬性參考。 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

另請參閱