Udostępnij za pośrednictwem


Zdalne a lokalne wykonywanie

Możesz zdecydować się na zdalne wykonywanie zapytań (czyli aparat bazy danych wykonuje zapytanie względem bazy danych) lub lokalnie (LINQ to SQL wykonuje zapytanie względem lokalnej pamięci podręcznej).

Zdalne wykonywanie

Rozważ następujące zapytanie:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
foreach (Order ord in
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
 Where cust.CustomerID = 19283).First()
    Dim orders = From ord In c.Orders _
                 Where ord.ShippedDate.Value.Year = 1998
    For Each nextOrder In orders
        ' Do something.
    Next

Jeśli baza danych zawiera tysiące wierszy zamówień, nie chcesz pobierać ich wszystkich w celu przetworzenia małego podzestawu. W linQ to SQL EntitySet<TEntity> klasa implementuje IQueryable interfejs. Takie podejście zapewnia zdalne wykonywanie takich zapytań. Dwie główne korzyści płynące z tej techniki:

  • Niepotrzebne dane nie są pobierane.

  • Zapytanie wykonywane przez aparat bazy danych jest często bardziej wydajne ze względu na indeksy bazy danych.

lokalne wykonanie

W innych sytuacjach może być potrzebny pełny zestaw powiązanych jednostek w lokalnej pamięci podręcznej. W tym celu EntitySet<TEntity> udostępnia metodę Load jawnego ładowania wszystkich elementów członkowskich obiektu EntitySet<TEntity>.

Jeśli obiekt EntitySet<TEntity> jest już załadowany, kolejne zapytania są wykonywane lokalnie. Takie podejście pomaga na dwa sposoby:

  • Jeśli kompletny zestaw musi być używany lokalnie lub wiele razy, możesz uniknąć zapytań zdalnych i skojarzonych opóźnień.

  • Jednostka może być serializowana jako kompletna jednostka.

Poniższy fragment kodu ilustruje sposób uzyskiwania lokalnego wykonywania:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
c.Orders.Load();

foreach (Order ord in
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}
        }
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
 Where cust.CustomerID = 19283).First
    c.Orders.Load()

    Dim orders = From ord In c.Orders _
                 Where ord.ShippedDate.Value.Year = 1998

    For Each nextOrder In orders
        ' Do something.
    Next

Porównanie

Te dwie możliwości zapewniają zaawansowaną kombinację opcji: zdalne wykonywanie dużych kolekcji i lokalne wykonywanie dla małych kolekcji lub miejsce, w którym potrzebna jest kompletna kolekcja. Zdalne wykonywanie jest implementne za pośrednictwem metody IQueryablei lokalnego wykonywania względem kolekcji w pamięci IEnumerable<T> . Aby wymusić wykonywanie lokalne (tj. IEnumerable<T>), zobacz Konwertowanie typu na ogólny element IEnumerable.

Zapytania względem zestawów nieurządzanych

Zwróć uwagę na ważną różnicę między kolekcją lokalną, która implementuje List<T> i kolekcją, która udostępnia zapytania zdalne wykonywane względem nieurządzanych zestawów w relacyjnej bazie danych. List<T> metody takie jak te, które używają wartości indeksu, wymagają semantyki listy, których zwykle nie można uzyskać za pomocą zapytania zdalnego względem zestawu nieurządkowanego. Z tego powodu takie metody niejawnie ładują element , EntitySet<TEntity> aby umożliwić wykonywanie lokalne.

Zobacz też