Freigeben über


Abrufen von Objekten aus dem Identitätscache

In diesem Thema werden die Typen von LINQ to SQL-Abfragen beschrieben, die ein Objekt aus dem Identitätscache zurückgeben, der vom DataContextverwaltet wird.

In LINQ to SQL besteht eine der Möglichkeiten, wie das DataContext Objekte verwaltet, darin besteht, Objektidentitäten in einem Identitätscache zu protokollieren, während Abfragen ausgeführt werden. In einigen Fällen versucht LINQ to SQL, ein Objekt aus dem Identitätscache abzurufen, bevor eine Abfrage in der Datenbank ausgeführt wird.

Im Allgemeinen muss die Abfrage, damit eine LINQ to SQL-Abfrage ein Objekt aus dem Identitätscache zurückgibt, auf dem Primärschlüssel eines Objekts basieren und ein einzelnes Objekt zurückgeben. Insbesondere muss sich die Abfrage in einem der unten aufgeführten allgemeinen Formulare befindet.

Hinweis

Vorkompilierte Abfragen geben keine Objekte aus dem Identitätscache zurück. Weitere Informationen zu vorab kompilierten Abfragen finden Sie unter CompiledQuery und So speichern und wiederverwenden Sie Abfragen.

Eine Abfrage muss sich in einem der folgenden allgemeinen Formulare befinden, um ein Objekt aus dem Identitätscache abzurufen:

In diesen allgemeinen Formen werden Function1, Function2und predicate wie folgt definiert.

Function1 kann eine der folgenden Sein:

Function2 kann eine der folgenden Sein:

predicate muss ein Ausdruck sein, in dem die Primärschlüsseleigenschaft des Objekts auf einen konstanten Wert festgelegt ist. Wenn ein Objekt über einen Primärschlüssel verfügt, der von mehreren Eigenschaften definiert ist, muss jede Primärschlüsseleigenschaft auf einen Konstantenwert festgelegt werden. Im Folgenden sind Beispiele dafür aufgeführt, wie das Formular predicate aussehen muss:

  • c => c.PK == constant_value

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

Beispiel

Der folgende Code enthält Beispiele für die Typen von LINQ to SQL-Abfragen, die ein Objekt aus dem Identitätscache abrufen.

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 {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)

Siehe auch