Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Wykonywanie lokalne
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 uzyskania 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ą silną kombinację opcji: zdalne wykonywanie na dużych kolekcjach oraz lokalne wykonywanie na małych kolekcjach lub tam, gdzie potrzebna jest kompletna kolekcja. Realizujesz zdalne wykonywanie za pośrednictwem IQueryable, a lokalne wykonywanie 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 nieuporządkowanych
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.