Wykonywanie zapytań w relacjach
Odwołania do innych obiektów lub kolekcji innych obiektów w definicjach klas bezpośrednio odpowiadają relacjom klucza obcego w bazie danych. Te relacje można używać podczas wykonywania zapytań przy użyciu notacji kropkowej, aby uzyskać dostęp do właściwości relacji i przejść z jednego obiektu do drugiego. Te operacje dostępu przekładają się na bardziej złożone sprzężenia lub skorelowane podzapytania w równoważnym języku SQL.
Na przykład następujące zapytanie przechodzi z zamówień do klientów jako sposób ograniczenia wyników tylko do tych zamówień dla klientów znajdujących się w Londynie.
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
Jeśli właściwości relacji nie istnieją, musisz napisać je ręcznie jako sprzężenia, podobnie jak w zapytaniu SQL, jak w poniższym kodzie:
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
Możesz użyć właściwości relacji , aby zdefiniować tę konkretną relację jednorazowo. Następnie można użyć wygodniejszej składni kropki. Jednak właściwości relacji istnieją ważniejsze, ponieważ modele obiektów specyficzne dla domeny są zwykle definiowane jako hierarchie lub grafy. Obiekty, względem których programujesz, mają odwołania do innych obiektów. Jest to tylko szczęśliwy przypadek, że relacje obiekt-obiekt odpowiadają relacjom w stylu obcym w bazach danych. Następnie dostęp do właściwości zapewnia wygodny sposób zapisu sprzężeń.
W związku z tym właściwości relacji są ważniejsze po stronie wyników zapytania niż w ramach samego zapytania. Po pobraniu danych dotyczących określonego klienta zapytanie oznacza, że klienci mają zamówienia. Innymi słowy, oczekujesz Orders
, że właściwość określonego klienta będzie kolekcją wypełniona wszystkimi zamówieniami od tego klienta. W rzeczywistości jest to kontrakt zadeklarowany przez zdefiniowanie klas w ten sposób. Oczekujesz, że zamówienia tam będą widoczne, nawet jeśli zapytanie nie zażądało zamówień. Oczekujesz, że model obiektów zachowa iluzję, że jest to rozszerzenie w pamięci bazy danych z powiązanymi obiektami natychmiast dostępnymi.
Teraz, gdy masz relacje, możesz pisać zapytania, odwołując się do właściwości relacji zdefiniowanych w klasach. Odwołania do tych relacji odpowiadają relacjom klucza obcego w bazie danych. Operacje korzystające z tych relacji przekładają się na bardziej złożone sprzężenia w równoważnym języku SQL. O ile zdefiniowano relację (przy użyciu atrybutu AssociationAttribute ), nie trzeba kodować jawnego sprzężenia w linQ to SQL.
Aby utrzymać tę iluzję, LINQ to SQL implementuje technikę o nazwie odroczone ładowanie. Aby uzyskać więcej informacji, zobacz Odroczone i Bezpośrednie ładowanie.
Rozważ następujące zapytanie SQL, aby utworzyć listę CustomerID
-OrderID
par:
SELECT t0.CustomerID, t1.OrderID
FROM Customers AS t0 INNER JOIN
Orders AS t1 ON t0.CustomerID = t1.CustomerID
WHERE (t0.City = @p0)
Aby uzyskać te same wyniki przy użyciu linQ to SQL, należy użyć Orders
odwołania do właściwości już istniejącej w Customer
klasie. Dokumentacja Orders
zawiera informacje niezbędne do wykonania zapytania i projektu CustomerID
-OrderID
par, jak w poniższym kodzie:
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
Możesz również wykonać odwrotnie. Oznacza to, że możesz wykonać zapytanie Orders
i użyć odwołania do relacji Customer
, aby uzyskać dostęp do informacji o skojarzonym Customer
obiekcie. Poniższy kod projektuje te same CustomerID
-OrderID
pary co poprzednio, ale tym razem, wykonując Orders
zapytanie zamiast 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