Freigeben über


Remote- und lokale Ausführung

Sie können ihre Abfragen entweder remote ausführen (d. a. das Datenbankmodul führt die Abfrage für die Datenbank aus) oder lokal (LINQ to SQL führt die Abfrage für einen lokalen Cache aus).

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 enthält, möchten Sie sie nicht alle abrufen, um eine kleine Teilmenge zu verarbeiten. In LINQ to SQL implementiert die EntitySet<TEntity> Klasse die IQueryable Schnittstelle. Mit diesem Ansatz wird sichergestellt, dass solche Abfragen remote ausgeführt werden können. Zwei hauptvorteile dieser Technik:

  • 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 möglicherweise über den vollständigen Satz verwandter Entitäten im lokalen Cache verfügen. Zu diesem Zweck stellt EntitySet<TEntity> die Load-Methode zum expliziten Laden aller Mitglieder der EntitySet<TEntity> bereit.

Wenn ein EntitySet<TEntity> bereits geladen ist, werden nachfolgende Abfragen lokal ausgeführt. Dieser Ansatz hilft auf zwei Arten:

  • Wenn der vollständige Satz lokal oder mehrmals verwendet werden muss, können Sie Remoteabfragen und zugeordnete Latenzen vermeiden.

  • Die Entität kann als vollständige Entität serialisiert werden.

Das folgende Codefragment veranschaulicht, wie die lokale Ausführung abgerufen 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 Funktionen bieten eine leistungsstarke Kombination von Optionen: Remoteausführung für große Sammlungen und lokale Ausführung für kleine Sammlungen oder wo die vollständige Sammlung erforderlich ist. Sie implementieren die Remoteausführung über IQueryable, und die lokale Ausführung erfolgt gegen eine In-Memory-Sammlung IEnumerable<T>. Um die lokale Ausführung zu erzwingen (d.h. IEnumerable<T>), siehe Konvertieren eines Typs in einen generischen IEnumerable.

Abfragen von ungeordneten Sätzen

Beachten Sie den wichtigen Unterschied zwischen einer lokalen Auflistung, die List<T> implementiert, und einer Auflistung, die Remoteabfragen bereitstellt, die in einer relationalen Datenbank für ungeordnete Sätze ausgeführt werden. List<T> Methoden wie solche, die Indexwerte verwenden, erfordern Listensemantik, die in der Regel nicht über eine Remoteabfrage für einen nicht angeordneten Satz abgerufen werden können. Aus diesem Grund laden solche Methoden implizit die EntitySet<TEntity>, um lokale Ausführung zu ermöglichen.

Siehe auch