クラス定義内の他のオブジェクトまたは他のオブジェクトのコレクションへの参照は、データベース内の外部キーリレーションシップに直接対応します。 これらのリレーションシップは、ドット表記を使用してクエリを実行し、リレーションシップ プロパティにアクセスし、あるオブジェクトから別のオブジェクトに移動するときに使用できます。 これらのアクセス操作は、同等の 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
リレーションシップ プロパティを使用して、この特定のリレーションシップを 1 回定義できます。 その後、より便利なドット構文を使用できます。 ただし、ドメイン固有のオブジェクト モデルは通常階層またはグラフとして定義されるため、リレーションシップ プロパティがより重要になります。 プログラム対象のオブジェクトには、他のオブジェクトへの参照があります。 オブジェクトとオブジェクトのリレーションシップが、データベース内の外部キー スタイルのリレーションシップに対応するのは幸せな偶然にすぎません。 プロパティ アクセスは、結合を記述する便利な方法を提供します。
これに関して、リレーションシップ プロパティは、クエリ自体の一部としてよりも、クエリの結果側で重要です。 クエリが特定の顧客に関するデータを取得した後、クラス定義は顧客が注文を持っていることを示します。 言い換えると、特定の顧客の 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