Odroczone a bezpośrednie ładowanie

Podczas wykonywania zapytania o obiekt faktycznie pobierasz tylko żądany obiekt. Powiązane obiekty nie są pobierane automatycznie w tym samym czasie. (Aby uzyskać więcej informacji, zobacz Wykonywanie zapytań w relacjach). Nie widać faktu, że powiązane obiekty nie zostały jeszcze załadowane, ponieważ próba uzyskania do nich dostępu powoduje wygenerowanie żądania, które je pobiera.

Na przykład możesz chcieć wykonać zapytanie dotyczące określonego zestawu zamówień, a następnie tylko od czasu do czasu wysyłać powiadomienia e-mail do konkretnych klientów. Niekoniecznie musisz początkowo pobierać wszystkie dane klientów z każdym zamówieniem. Możesz użyć odroczonego ładowania, aby odroczyć pobieranie dodatkowych informacji, dopóki nie trzeba absolutnie tego robić. Rozważmy następujący przykład:

    Northwnd db = new Northwnd(@"northwnd.mdf");

    IQueryable<Order> notificationQuery =
    from ord in db.Orders
 where ord.ShipVia == 3
  select ord;

    foreach (Order ordObj in notificationQuery)
    {
        if (ordObj.Freight > 200)
            SendCustomerNotification(ordObj.Customer);
        ProcessOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim notificationQuery = _
    From ord In db.Orders _
    Where ord.ShipVia = 3 _
    Select ord

For Each ordObj As Order In notificationQuery
    If ordObj.Freight > 200 Then
        SendCustomerNotification(ordObj.Customer)
        ProcessOrder(ordObj)
    End If

Next

Przeciwieństwo może być również prawdziwe. Być może masz aplikację, która musi jednocześnie wyświetlać dane klienta i zamówienia. Wiesz, że potrzebne są oba zestawy danych. Wiesz, że aplikacja potrzebuje informacji o zamówieniu dla każdego klienta, gdy tylko uzyskasz wyniki. Nie chcesz przesyłać pojedynczych zapytań dotyczących zamówień dla każdego klienta. To, co naprawdę chcesz, to pobrać dane zamówienia wraz z klientami.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.DeferredLoadingEnabled = false;

IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

foreach (Customer custObj in custQuery)
{
    foreach (Order ordObj in custObj.Orders)
    {
        ProcessCustomerOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")

db.DeferredLoadingEnabled = False

Dim custQuery = _
    From cust In db.Customers _
    Where cust.City = "London" _
    Select cust

For Each custObj As Customer In custQuery
    For Each ordObj As Order In custObj.Orders
        ProcessCustomerOrder(ordObj)
    Next
Next

Możesz również dołączyć klientów i zamówienia w zapytaniu, tworząc między produktami i pobierając wszystkie względne bity danych jako jedną dużą projekcję. Ale te wyniki nie są jednostkami. (Aby uzyskać więcej informacji, zobacz Model obiektów LINQ to SQL). Jednostki to obiekty, które mają tożsamość i które można modyfikować, podczas gdy te wyniki będą projekcjami, których nie można zmienić i utrwalić. Co gorsza, pobieranie wielu nadmiarowych danych jest powtarzane przez każdego klienta dla każdego zamówienia w spłaszczonej danych wyjściowych sprzężenia.

To, czego naprawdę potrzebujesz, to sposób pobierania zestawu powiązanych obiektów w tym samym czasie. Zestaw jest linią wykresu, aby nigdy nie pobierać więcej lub mniej niż było to konieczne do zamierzonego użycia. W tym celu linQ to SQL zapewnia DataLoadOptions natychmiastowe ładowanie regionu modelu obiektów. Metody obejmują:

  • Metoda LoadWith , aby natychmiast załadować dane powiązane z głównym obiektem docelowym.

  • Metoda AssociateWith , aby filtrować obiekty pobrane dla określonej relacji.

Zobacz też