Objecten ophalen uit de identiteitscache
In dit onderwerp worden de typen LINQ naar SQL-query's beschreven die een object retourneren uit de identiteitscache die wordt beheerd door de DataContext.
In LINQ naar SQL is een van de manieren waarop objecten DataContext worden beheerd door objectidentiteiten in een identiteitscache te registreren terwijl query's worden uitgevoerd. In sommige gevallen probeert LINQ naar SQL een object op te halen uit de identiteitscache voordat een query in de database wordt uitgevoerd.
Over het algemeen moet de query zijn gebaseerd op de primaire sleutel van een object van een object en één object retourneren om een object uit de identiteitscache te retourneren. In het bijzonder moet de query zich in een van de onderstaande algemene formulieren bevinden.
Notitie
Vooraf gecompileerde query's retourneren geen objecten uit de identiteitscache. Zie en procedures voor meer informatie over vooraf gecompileerde query's: Query's CompiledQueryopslaan en opnieuw gebruiken.
Een query moet zich in een van de volgende algemene formulieren bevinden om een object op te halen uit de identiteitscache:
Table<TEntity>
.Function1(
predicate
)
Table<TEntity>
.Function1(
predicate
).Function2()
In deze algemene formulieren, Function1
en Function2
predicate
worden als volgt gedefinieerd.
Function1
kan een van de volgende zijn:
Function2
kan een van de volgende zijn:
predicate
moet een expressie zijn waarin de primaire sleuteleigenschap van het object is ingesteld op een constante waarde. Als een object een primaire sleutel heeft die door meer dan één eigenschap is gedefinieerd, moet elke eigenschap van de primaire sleutel worden ingesteld op een constante waarde. Hier volgen enkele voorbeelden van het formulier predicate
:
c => c.PK == constant_value
c => c.PK1 == constant_value1 && c=> c.PK2 == constant_value2
Opmerking
De volgende code bevat voorbeelden van de typen LINQ naar SQL-query's waarmee een object wordt opgehaald uit de identiteitscache.
NorthwindDataContext context = new NorthwindDataContext();
// This query does not retrieve an object from
// the query cache because it is the first query.
// There are no objects in the cache.
var a = context.Customers.First();
Console.WriteLine("First query gets customer {0}. ", a.CustomerID);
// This query returns an object from the query cache.
var b = context.Customers.Where(c => c.CustomerID == a.CustomerID);
foreach (var customer in b )
{
Console.WriteLine(customer.CustomerID);
}
// This query returns an object from the identity cache.
// Note that calling FirstOrDefault(), Single(), or SingleOrDefault()
// instead of First() will also return an object from the cache.
var x = context.Customers.
Where(c => c.CustomerID == a.CustomerID).
First();
Console.WriteLine(x.CustomerID);
// This query returns an object from the identity cache.
// Note that calling FirstOrDefault(), Single(), or SingleOrDefault()
// instead of First() (each with the same predicate) will also
// return an object from the cache.
var y = context.Customers.First(c => c.CustomerID == a.CustomerID);
Console.WriteLine(y.CustomerID);
Dim context As New NorthwindDataContext()
' This query does not retrieve an object from
' the query cache because it is the first query.
' There are no objects in the cache.
Dim a = context.Customers.First()
Console.WriteLine("First query gets customer {0}. ", a.CustomerID)
' This query returns an object from the query cache.
Dim b = context.Customers.Where(Function(c) c.CustomerID = a.CustomerID)
For Each customer In b
Console.WriteLine(customer.CustomerID)
Next
' This query returns an object from the identity cache.
' Note that calling FirstOrDefault(), Single(), or SingleOrDefault()
' instead of First() will also return an object from the cache.
Dim x = context.Customers. _
Where(Function(c) c.CustomerID = a.CustomerID). _
First()
Console.WriteLine(x.CustomerID)
' This query returns an object from the identity cache.
' Note that calling FirstOrDefault(), Single(), or SingleOrDefault()
' instead of First() (each with the same predicate) will also
' return an object from the cache.
Dim y = context.Customers.First(Function(c) c.CustomerID = a.CustomerID)
Console.WriteLine(y.CustomerID)