Udostępnij za pośrednictwem


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

Zobacz też