Delen via


Externe versus lokale uitvoering

U kunt besluiten om uw query's extern uit te voeren (dat wil gezegd, de database-engine voert de query uit op de database) of lokaal (LINQ naar SQL voert de query uit op een lokale cache).

Uitvoering op afstand

Houd rekening met de volgende query:

            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

Als uw database duizenden rijen met orders heeft, wilt u ze niet allemaal ophalen om een kleine subset te verwerken. In LINQ naar SQL implementeert de EntitySet<TEntity> klasse de IQueryable interface. Deze aanpak zorgt ervoor dat dergelijke query's extern kunnen worden uitgevoerd. Er zijn twee belangrijke voordelen van deze techniek:

  • Overbodige gegevens worden niet opgehaald.

  • Een query die door de database-engine wordt uitgevoerd, is vaak efficiĆ«nter vanwege de database-indexen.

Lokale uitvoering

In andere situaties wilt u mogelijk de volledige set gerelateerde entiteiten in de lokale cache hebben. Voor dit doel EntitySet<TEntity> biedt u de Load methode om expliciet alle leden van de EntitySet<TEntity>.

Als een EntitySet<TEntity> query al is geladen, worden volgende query's lokaal uitgevoerd. Deze aanpak helpt op twee manieren:

  • Als de volledige set lokaal of meerdere keren moet worden gebruikt, kunt u externe query's en bijbehorende latenties voorkomen.

  • De entiteit kan worden geserialiseerd als een volledige entiteit.

Het volgende codefragment illustreert hoe lokale uitvoering kan worden verkregen:

            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

Vergelijking

Deze twee mogelijkheden bieden een krachtige combinatie van opties: externe uitvoering voor grote verzamelingen en lokale uitvoering voor kleine verzamelingen of waar de volledige verzameling nodig is. U implementeert externe uitvoering via IQueryableen lokale uitvoering op basis van een in-memory IEnumerable<T> verzameling. Zie Een type converteren naar een algemeen IEnumerable om lokale uitvoering (dat wil gezegd) IEnumerable<T>af te dwingen.

Query's op niet-geordende sets

Let op het belangrijke verschil tussen een lokale verzameling die implementeert List<T> en een verzameling die externe query's biedt die worden uitgevoerd op niet-geordende sets in een relationele database. List<T> voor methoden zoals methoden die gebruikmaken van indexwaarden, zijn lijstsemantiek vereist, die doorgaans niet kan worden verkregen via een externe query op basis van een niet-geordende set. Daarom laden dergelijke methoden impliciet de EntitySet<TEntity> om lokale uitvoering toe te staan.

Zie ook