Freigeben über


Remoteausführung im Vergleich zu lokaler Ausführung

Sie können festlegen, ob Ihre Abfragen remote (die Datenbank-Engine 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:

            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

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 von der Datenbank-Engine 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:

            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

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. Informationen zum Erzwingen der lokalen Ausführung (d. h. IEnumerable<T>) finden Sie unter Konvertieren eines Typs in ein generisches IEnumerable.

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.

Siehe auch