Načítání objektů z mezipaměti identit
Toto téma popisuje typy dotazů LINQ to SQL, které vracejí objekt z mezipaměti identit spravované službou DataContext.
V LINQ to SQL je jedním ze způsobů, jak DataContext spravovat objekty, protokolováním identit objektů v mezipaměti identit při provádění dotazů. V některých případech se LINQ to SQL pokusí načíst objekt z mezipaměti identit před spuštěním dotazu v databázi.
Obecně platí, že pokud dotaz LINQ to SQL vrátí objekt z mezipaměti identit, musí být dotaz založený na primárním klíči objektu a musí vracet jeden objekt. Konkrétně musí být dotaz v jednom z obecných formulářů uvedených níže.
Poznámka:
Předkompilované dotazy nebudou vracet objekty z mezipaměti identit. Další informace o předem kompilovaných dotazech najdete v tématu CompiledQuery a postupy: Ukládání a opakované použití dotazů.
Dotaz musí být v jednom z následujících obecných formulářů, aby se načetl objekt z mezipaměti identit:
Table<TEntity>
.Function1(
predicate
)
Table<TEntity>
.Function1(
predicate
).Function2()
V těchto obecných formách , Function1
a Function2
predicate
jsou definovány následujícím způsobem.
Function1
může být libovolná z následujících možností:
Function2
může být libovolná z následujících možností:
predicate
musí být výraz, ve kterém je vlastnost primárního klíče objektu nastavena na konstantní hodnotu. Pokud má objekt primární klíč definovaný více než jednou vlastností, musí být každá vlastnost primárního klíče nastavena na konstantní hodnotu. Tady jsou příklady formuláře predicate
:
c => c.PK == constant_value
c => c.PK1 == constant_value1 && c=> c.PK2 == constant_value2
Příklad
Následující kód obsahuje příklady typů dotazů LINQ to SQL, které načítají objekt z mezipaměti identit.
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)