Megosztás a következőn keresztül:


Objektumok lekérése az identitásgyorsítótárból

Ez a témakör a LINQ és az SQL-lekérdezések azon típusait ismerteti, amelyek egy objektumot adnak vissza a rendszer által DataContextfelügyelt identitás-gyorsítótárból.

A LINQ-ban az SQL-ben az objektumok kezelésének egyik módja az DataContext objektum-identitások naplózása az identitásgyorsítótárban a lekérdezések végrehajtásakor. Bizonyos esetekben a LINQ és az SQL megpróbál lekérni egy objektumot az identitás-gyorsítótárból, mielőtt lekérdezést hajt végre az adatbázisban.

Általánosságban elmondható, hogy ahhoz, hogy egy LINQ–SQL-lekérdezés visszaadjon egy objektumot az identitás-gyorsítótárból, a lekérdezésnek egy objektum elsődleges kulcsán kell alapulnia, és egyetlen objektumot kell visszaadnia. A lekérdezésnek különösen az alábbi általános űrlapok egyikében kell lennie.

Feljegyzés

Az előre lefordított lekérdezések nem adnak vissza objektumokat az identitás-gyorsítótárból. Az előre lefordított lekérdezésekről további információt a lekérdezések tárolása és újrafelhasználása című témakörben találCompiledQuery.

A lekérdezésnek az alábbi általános űrlapok egyikében kell lennie egy objektum lekéréséhez az identitás-gyorsítótárból:

Ezekben az általános formákban, Function1Function2és predicate az alábbiak szerint vannak definiálva.

Function1 az alábbiak bármelyike lehet:

Function2 az alábbiak bármelyike lehet:

predicate olyan kifejezésnek kell lennie, amelyben az objektum elsődleges kulcstulajdonságának állandó értékre van állítva. Ha egy objektum egynél több tulajdonság által definiált elsődleges kulccsal rendelkezik, minden elsődleges kulcs tulajdonságát állandó értékre kell állítani. Az űrlapnak predicate a következő példákat kell tartalmaznia:

  • c => c.PK == constant_value

  • c => c.PK1 == constant_value1 && c=> c.PK2 == constant_value2

Példa

Az alábbi kód példákat mutat be a LINQ és az SQL-lekérdezések típusaira, amelyek egy objektumot kérnek le az identitás-gyorsítótárból.

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)

Lásd még