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.