Remoteausführung von Abfragen im Vergleich zur lokalen Ausführung (LINQ to SQL)
Aktualisiert: November 2007
Sie können festlegen, ob Ihre Abfragen remote (das Datenbankmodul führt eine Abfrage mit der Datenbank aus ) oder lokal (LINQ to SQL führt die Abfrage mit einem lokalen Cache aus) erfolgen sollen.
Remoteausführung
Betrachten Sie die folgende Abfrage:
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
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.
}
Wenn Ihre Datenbank Tausende von Zeilen mit Bestellungen aufweist, möchten Sie diese nicht alle abrufen müssen, um eine kleinere Teilmenge zu bearbeiten. In LINQ to SQL implementiert die EntitySet<TEntity>-Klasse die IQueryable-Schnittstelle. Dieser Ansatz stellt sicher, dass solche Abfragen remote ausgeführt werden können. Aus dieser Technik ergeben sich zwei wesentliche Vorteile:
Unnötige Daten werden nicht abgerufen.
Eine vom Datenbankmodul ausgeführte Abfrage ist aufgrund der Datenbankindizes oft effizienter.
Lokale Ausführung
In anderen Situationen möchten Sie ggf. alle verbundenen Entitäten in den lokalen Cache übertragen. Zu diesem Zweck stellt EntitySet<TEntity> die Load-Methode bereit, um explizit alle Member von EntitySet<TEntity> zu laden.
Wenn ein EntitySet<TEntity> bereits geladen ist, werden nachfolgende Abfragen lokal ausgeführt. Dieser Ansatz unterstützt Sie auf zwei Arten:
Wenn der gesamte Satz lokal oder mehrmals verwendet werden muss, können Sie Remoteabfragen und die zugehörige Latenz vermeiden.
Die Entität kann als vollständige Entität serialisiert werden.
Das folgende Codefragment zeigt, wie die lokale Ausführung erreicht werden kann:
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
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.
}
}
Vergleich
Diese beiden Möglichkeiten bieten eine leistungsfähige Kombination aus Optionen: Remoteausführung für große Auflistungen und lokale Ausführung für kleine Auflistungen bzw. wenn die gesamte Auflistung benötigt wird. Die Remoteausführung wird mit IQueryable implementiert, die lokale Ausführung mit einer IEnumerable<T>-Auflistung im Arbeitsspeicher. Wenn Sie die lokale Ausführung (d. h. IEnumerable<T>) erzwingen möchten, lesen Sie den Abschnitt Gewusst wie: Konvertieren eines Typs in eine generische IEnumerable (LINQ to SQL).
Abfragen von ungeordneten Sätzen
Beachten Sie den wichtigen Unterschied zwischen einer lokalen Auflistung mit Implementierung von List<T> und einer Auflistung, die Remoteabfragen mit ungeordneten Sätzen in einer relationalen Datenbank ermöglicht. List<T>-Methoden wie jene, die Indexwerte verwenden, erfordern Listensemantik, die in der Regel nicht durch eine Remoteabfrage mit einem ungeordneten Satz erreicht werden kann. Aus diesem Grund laden diese Methoden implizit den EntitySet<TEntity>, um die lokale Ausführung zu ermöglichen.