RIA Services i eager loading.

Domyślnie kolekcje i referencje do innych encji używają opóźnionego ładowania (lazy loading). Wszystkie encje podlegające temu mechanizmowi są ładowane w tle(w sposób niewidoczny dla programisty) w momencie kiedy wymagany jest do nich dostęp. Załóżmy, że mamy encję Invoice, która zawiera kolekcję produktów:

class Invoice
{
    EntityCollection<Product> Products{get;set;}
    public string ReceiverName{get;set;}
    public string IssuerName{get;set;}
}

Gdy użyjemy zapytania odczytującego fakturę, zostaną zwrócone wyłącznie właściwości ReceiverName oraz IssuerName – bez kolekcji Products.

W większości przypadków mechanizm opóźnionego ładowania sprawdza się, jednak czasami chcemy mieć od razu zarówno wszystkie właściwości jak i kolekcje danych – bez potrzeby wysyłania dodatkowego zapytania o kolekcje w drugim zapytaniu. W takim przypadku musimy skorzystać z eager loading(ładowanie zachłanne).

Użycie eager loading w RIA Services składa się z dwóch etapów: skonfigurowania metadanych oraz wywołania metody include przy odczytywaniu danych.

Metadane konfigurujemy za pomocą klas częściowych w bibliotece w której posiadamy model encji(ADO .NET Entity Data Model):

[MetadataType(typeof(Invoice.InvoiceMetadata))]
public partial class Invoice
{
   internal sealed class InvoiceMetadata
   {
       [Include]
       public EntityCollection<Product> Products;
   }

}

Następnie dopisujemy metodę w DomainService:

public IQueryable<Invoice> GetInvoiceWithProducts()
{
  return this.ObjectContext.InvoiceSet.Include("Products");
}

Zwróćcie uwagę na metodę Include – to ona jest odpowiedzialna za eager loading. Teraz po stronie klienta możemy załadować wszystkie faktury wraz z produktami za pomocą poniższego kodu:

m_DataContext.Load<Entities.Invoice>(m_DataContext.GetInvoiceWithProducts());

Leave a Reply

Your email address will not be published.