Kapcsolatok közötti lekérdezés
Az osztálydefiníciókban lévő más objektumokra vagy más objektumok gyűjteményeire mutató hivatkozások közvetlenül felelnek meg az adatbázis idegenkulcs-kapcsolatainak. Ezeket a kapcsolatokat akkor használhatja, ha pont jelöléssel kérdezi le a kapcsolat tulajdonságait, és navigál az egyik objektumból a másikba. Ezek a hozzáférési műveletek összetettebb illesztésekre vagy az azzal egyenértékű SQL-ben korrelált al lekérdezésekre fordíthatók.
Az alábbi lekérdezés például a rendelésekről az ügyfelekre navigál, így az eredményeket csak a Londonban található ügyfelekre vonatkozó rendelésekre korlátozhatja.
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
Ha a kapcsolattulajdonságok nem léteznek, manuálisan kell őket illesztésként megírnia, ugyanúgy, mint egy SQL-lekérdezésben, mint az alábbi kódban:
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
A kapcsolattulajdonság használatával egyszer definiálhatja ezt a kapcsolatot. Ezután használhatja a kényelmesebb pont szintaxist. A kapcsolattulajdonságok azonban sokkal fontosabbak, mivel a tartományspecifikus objektummodellek általában hierarchiaként vagy gráfként vannak definiálva. A programozott objektumok más objektumokra mutató hivatkozásokkal rendelkeznek. Ez csak egy boldog véletlen, hogy az objektum-objektum kapcsolatok felelnek meg az idegenkulcs-stílusú kapcsolatok az adatbázisokban. A tulajdonsághozzáférés ezután kényelmes módot biztosít az illesztések írására.
Ezzel kapcsolatban a kapcsolat tulajdonságai fontosabbak a lekérdezés eredményoldalán, mint magának a lekérdezésnek a részeként. Miután a lekérdezés adatokat kér le egy adott ügyfélről, az osztálydefiníció azt jelzi, hogy az ügyfelek megrendelésekkel rendelkeznek. Más szóval elvárja, hogy egy Orders
adott ügyfél tulajdonsága olyan gyűjtemény legyen, amely az adott ügyféltől érkező összes megrendeléssel van feltöltve. Valójában ez az a szerződés, amelyet az osztályok ilyen módon történő meghatározásával deklarált. Akkor is látnia kell a rendeléseket, ha a lekérdezés nem kért megrendeléseket. Elvárja, hogy az objektummodell fenntartsa azt az illúziót, hogy az adatbázis memórián belüli kiterjesztése, amely azonnal elérhető a kapcsolódó objektumokkal.
Most, hogy már rendelkezik kapcsolatokkal, lekérdezéseket írhat az osztályokban definiált kapcsolati tulajdonságokra hivatkozva. Ezek a kapcsolathivatkozások az adatbázisban lévő idegenkulcs-kapcsolatoknak felelnek meg. Az ilyen kapcsolatokat használó műveletek összetettebb illesztésekre fordíthatóak az egyenértékű SQL-ben. Amíg definiált egy kapcsolatot (az AssociationAttribute attribútum használatával), nem kell explicit illesztést kódolnia a LINQ-ban az SQL-hez.
Ennek az illúziónak a fenntartása érdekében a LINQ to SQL egy késleltetett betöltés nevű technikát implementál. További információ: Halasztott és azonnali betöltés.
Fontolja meg a következő SQL-lekérdezést a párok listájának kivetítéséhez 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)
Ha ugyanazt az eredményt szeretné elérni a LINQ és az SQL használatával, használja az Orders
osztályban már meglévő tulajdonsághivatkozást Customer
. A Orders
hivatkozás a lekérdezés végrehajtásához és a CustomerID
-OrderID
párok kivetítéséhez szükséges információkat tartalmazza, ahogyan az alábbi kódban is látható:
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
A fordított műveletet is elvégezheti. Ez azt is jelentheti, hogy lekérdezheti Orders
és felhasználhatja a kapcsolati hivatkozását Customer
a társított Customer
objektum információinak eléréséhez. Az alábbi kód ugyanazokat CustomerID
-OrderID
a párokat projektek, mint korábban, de ezúttal lekérdezés Orders
helyett.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