EF Core-Erweiterungsmethoden
NCache Bietet synchrone und asynchrone Erweiterungsmethoden zum Zwischenspeichern von Abfragen in EF Core. Die Synchronisierungs-APIs sind Erweiterungsmethoden für IQueryable
Schnittstelle, während die asynchronen APIs eine Aufgabeninstanz für diese Methoden zurückgeben.
Note
Diese Funktion ist auch in verfügbar NCache Professional.
Um die folgenden APIs zu nutzen, schließen Sie den folgenden Namespace in Ihre Anwendung ein:
Alachisoft.NCache.EntityFrameworkCore
NCacheDer Entity Framework Core Caching Provider enthält die folgenden APIs zum Caching von Abfragen:
Synchrone APIs | Asynchrone APIs |
---|---|
FromCache |
FromCacheAsync |
LoadIntoCache |
LoadIntoCacheAsync |
FromCacheOnly |
FromCacheOnlyAsync |
FromCache
Die Erweiterungsmethode eignet sich ideal für die Verarbeitung von Transaktionsdaten (mit häufigen Lese- und Schreibvorgängen). Zum Beispiel die Pflege von Flugaufzeichnungen, bei denen jeder einzelne Flug eine kontinuierliche Datenbankprotokollierung neuer Einträge erfordert. Alternativ können Sie für Referenzdaten (wo Lesevorgänge häufiger vorkommen als Schreibvorgänge) verwenden LoadIntoCache
und FromCacheOnly
Erweiterungsmethoden. Genau wie in einem Produktkatalog, in dem Produkte als Referenzdaten behandelt werden, da sie selten geändert und konsistent aus der Datenbank gelesen werden. Um diese Referenzdatenerweiterungsmethoden verwenden zu können, müssen Sie die Abfrageindizes in Ihrer Anwendung definieren. Dies kann dynamisch durch Hinzufügen erfolgen [QueryIndexable]
-Tag.
Speichern von Cache-Daten mit EFCore
In FromCache
, LoadIntoCache
, FromCacheOnly
und ihre asynchronen Gegenstücke können Sie die EF Core-Caching-Abfragen verwenden, um Daten für nachfolgende Abfragen im Cache zu speichern.
Sie können die Daten auf zwei Arten im Cache speichern: Speichern Sie den gesamten Datensatz als Sammlung für einen einzelnen Schlüssel im Datenspeicher, indem Sie einen Einfügeaufruf verwenden. Oder Sie können jede Entität separat für mehrere Schlüssel in einem Bulk hinzufügen. Sie können diese Auswahl mithilfe der CachingOption treffen StoreAs
einstellen StoreAs.Collection
or StoreAs.SeperateEntities
. Sie können angeben und aktivieren bulkInsertChunkSize
wenn es sich um eine beträchtliche Anzahl von Entitäten handelt, z. B. 100,000. Dadurch wird sichergestellt, dass die Daten unabhängig von der Größe des Datensatzes Stück für Stück in den Cache geladen werden, wodurch der Datenspeicherprozess effizienter und verwaltbarer wird.
Note
Das bulkInsertChunkSize
Die Eigenschaft teilt den Großteil der Entitäten in kleinere Blöcke auf und aktualisiert den Cache Block für Block. Auf diese Weise kann der Vorgang das Verbindungszeitlimit umgehen, indem ein Teil der Entitäten innerhalb der 90-Sekunden-Grenze zwischengespeichert wird, wodurch verhindert wird, dass das Abbruchtoken ausgelöst wird. Standardmäßig ist die bulkInsertChunkSize
ist 1000.
Wichtig
Da die Anwendung erst dann eine Antwort erhält, wenn die gesamte Masse zwischengespeichert ist, ist es am besten, eine Async-Erweiterungsmethode zu verwenden, um erhebliche Verzögerungen bei der Verarbeitung eines großen Datensatzes zu vermeiden.
FromCache
Das FromCache
Die Methode speichert die für die LINQ-Abfrage generierten Ergebnissatzdaten zwischen und gibt sie an die Anwendung zurück. Wenn die Daten nicht im Cache vorhanden sind, werden sie von der Datenquelle abgerufen und im Cache gespeichert. Wenn die Anwendung dieselbe Abfrage erneut durchführt, ruft sie die erforderlichen Daten aus dem Cache ab und vermeidet so eine unnötige Fahrt zur Datenquelle.
Da diese Methode jedoch auf zwei Ebenen erfolgt (Abrufen der Ergebnismengendaten und Aktualisieren des Caches), besteht insbesondere im letzteren Fall ein erhöhtes Fehlerrisiko. Es kann aus verschiedenen Gründen fehlschlagen, den Cache zu aktualisieren. Zum Beispiel ein Datenbankverbindungsfehler, ein Netzwerkfehler, ein Cache-/Serverausfall, ein Fehler bei der Serialisierung der Daten, ein Zustandsübertragungsszenario usw.
Daher sind NCache Bietet Benutzern Beschäftigung FromCache
an. Nach der Installation können Sie HEIC-Dateien mit der errorEnabled
Flag, mit dem sie bestimmen können, ob sie die Anwendung wegen Problemen stoppen möchten, die nicht mit der Ergebnismenge zusammenhängen. Wenn Caching und Systemleistung Priorität haben, setzen Benutzer dieses Flag im Allgemeinen auf „True“ (da sich die Abfrage andernfalls jedes Mal mit der Datenquelle befasst). Wenn ihre Priorität jedoch darin besteht, das Anhalten der Anwendung zu verhindern, setzen Benutzer dieses Flag auf „Falsch“.
Note
Standardmäßig ist die errorEnabled
Flag ist auf False gesetzt.
Note
Auch wenn die errorEnabled
Wenn das Flag „False“ ist, werden diese Aktualisierungs-Cache-bezogenen Ausnahmen in den Cache-Protokollen protokolliert, die unter verfügbar sind %NCHome%/log-files
.
Beispiele
- Das folgende Beispiel ruft Kundendetails basierend auf einer angegebenen Kunden-ID aus der Datenbank ab und speichert sie als separate Entität im Cache mit angegebenen Caching-Optionen.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(options).ToList();
}
Note
Sie können die Aktivität Ihres Caches auch mit überwachen NCache Monitor.
- Das folgende Beispiel gibt den intern generierten Cache-Schlüssel für die als Sammlung im Cache gespeicherten Abfrageergebnisdaten zurück. Dieser Schlüssel kann für die zukünftige Verwendung gespeichert werden, z. B. zum Entfernen der Entität/Ergebnismenge aus dem Cache.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(out string cacheKey, options);
}
Note
Durch die Nutzung Export-CacheKeys Im Tool Ihrer Wahl können Sie die Cache-Schlüssel eines bestimmten Caches anzeigen.
Überlegungen zu FromCache
FromCache
unterstützt folgende Funktionen:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
FirstOrDefault
Die Funktionen können bei Verwendung von LINQ mit implementiert werden FromCache
, wie folgt:
- Das
Like
Der Operator in EF Core führt einen Mustervergleich innerhalb von Zeichenfolgen durch. Normalerweise wird es mit eingesetztWhere
inSELECT
Anweisungen zum Filtern von Zeilen basierend auf bestimmten Mustern oder Teilzeichenfolgen innerhalb des Werts einer Spalte. Darüber hinaus ist die Verwendung von Platzhaltern möglich, um ein oder mehrere Zeichen in einer Zeichenfolge zu finden:
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCache(options)
.ToList();
}
- Das
Contains
Der Operator kann ähnlich wie der verwendet werdenLike
Operator, um musterbasierte Suchen innerhalb eines bestimmten Kriteriums durchzuführen.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCache(out cacheKey, options)
}
- Das
FirstOrDefault
Der Operator kann wie unten gezeigt implementiert werden.
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(b => b.UnitPrice > 1)
.FromCache(out cacheKey, options)
.FirstOrDefault();
}
- Das
GroupBy
kann mit der unten implementierten Projektion für FromCache verwendet werden.
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.FromCache(out cacheKey, options)
.ToList();
}
LoadIntoCache
Das LoadIntoCache
Die API ruft die Ergebnissatzdaten von der Quelle ab und speichert sie zwischen, ohne sie an die Anwendung zurückzugeben. Diese API ermöglicht nachfolgende FromCache
Aufrufe, um neue Daten zu erhalten. Der LoadIntoCache
Die Methode eignet sich besonders für häufig aktualisierte Daten wie Kundenbestellungen oder sensible Daten wie Zahlungsdetails. In solchen Szenarien kann die Verwendung veralteter Daten zu fehlerhaften Geschäftstransaktionen führen. Daher muss jederzeit eine neue Kopie der Daten im Cache vorhanden sein. Diese Erweiterungsmethode lädt Ihren gesamten Arbeitsdatensatz in den Cache. Anschließend fragt diese Methode die Datenbank ab, speichert das Ergebnis im Cache und gibt es an die Anwendung zurück.
Beispiele
- Das folgende Beispiel ruft die Kundenbestellungen aus der Datenbank ab und lädt die Ergebnissatzdaten als Sammlung in den Cache. Außerdem wird der intern generierte Cache-Schlüssel zurückgegeben, der für die zukünftige Verwendung gespeichert werden kann.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.Collection
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(out string cacheKey, options);
}
- Das folgende Beispiel lädt die spezifischen Bestelldetails aus der Datenbank als separate Entitäten mit angegebenen Caching-Optionen in den Cache.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(options);
}
- Das
GroupBy
Kann mit Projektion verwendet werden fürLoadIntoCache
wie unten implementiert.
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.LoadIntoCache(out cacheKey, options)
.ToList();
}
Sie können diese Methode in regelmäßigen Abständen ausführen, wenn Sie erwarten, dass sich die Daten ändern. Wenn Sie beispielsweise Datenänderungen innerhalb einer Woche vorhersehen, stellen Sie durch eine erneute Ausführung nach diesem Zeitraum sicher, dass die Daten im Cache aktualisiert werden.
FromCacheOnly
Bei Daten, die seltener aktualisiert werden, wie z. B. Kundendaten, ist der regelmäßige Abruf aus der Datenquelle kostspielig. FromCacheOnly
fragt die im Cache vorhandenen Entitäten ab und nähert sich in keinem Fall der Datenquelle. Wenn die Entität nicht im Cache vorhanden ist, wird sie im Wesentlichen trotzdem nicht aus der Datenquelle abgerufen.
Note
Diese API funktioniert nur, wenn Entitäten separat gespeichert werden, also die Caching-Option StoreAs
eingestellt ist SeperateEntities
.
Wichtig
Die Entitäten müssen im indexiert sein NCache Management Center, bevor Sie sie verwenden FromCacheOnly
.
- Das folgende Beispiel ruft die Kundeninformationen aus dem Cache ab, wenn der Kundenfälle Entität existiert. Andernfalls ist die zurückgegebene Ergebnismenge leer.
using (var context = new NorthwindContext())
{
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnly();
}
Überlegungen zu FromCacheOnly
FromCacheOnly
unterstützt Aggregatfunktionen. Diese Funktionen speichern jedoch nur das Ergebnis und nicht die Entitäten selbst im Cache. Somit, NCache bietet die QueryDeferred
Methode, die die Abfrage verzögert, sodass die Entitäten im Cache das Ergebnis als Antwort auf eine Abfrage erhalten. Weitere Einzelheiten zu verzögerten APIs finden Sie im Kapitel Abfragen verzögerter APIs. FromCacheOnly
unterstützt folgende Funktionen:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
Beachten Sie bei der Verwendung von LINQ die folgenden Überlegungen FromCacheOnly
:
Außer für
Count
, alle Aggregatfunktionen müssen ganzzahlige Werte haben.Count
muss mit einer Entität zum Zählen versehen werden.Ein einzelner LINQ-Ausdruck für
FromCacheOnly
kann nicht mehr als eine Aggregatfunktion verwenden.Projektionen in LINQ-Ausdrücken können nur durchgeführt werden, wenn a
GroupBy
Es werden ein Operator und eine Aggregatfunktion verwendetFromCacheOnly
.Mehrfachprojektionen werden nicht unterstützt. In einem LINQ-Ausdruck kann nur ein Attribut projiziert werden (das übertragen wird).
using (var context = new NorthwindContext())
{
var result = context.Employees
.Select(e => e.EmployeeId) // Multiple projections have not been performed
.GroupBy(eid => eid) // eId was projected so GroupBy had to be used
.DeferredMin() // MIN provided with a numeric attribute
.FromCacheOnly();
}
GroupBy
wird hauptsächlich für Aggregationsfunktionen (Gruppieren des Ergebnisses von Abfragen mithilfe von Spalten) verwendet und kann nur verwendet werden, wenn die Projektion zuvor vollständig ist und eine Aggregatfunktion verwendet wird.GroupBy
muss der letzte Operator im LINQ-Ausdruck sein, außer wennOrderBy
wird eingesetzt. In solchen Fällen ist dieGroupBy
Funktion kann nach vorne verschoben werden (nachOrderBy
) oder rückwärts (vorherOrderBy
).
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(data => data.ProductName == "Tofu")
.GroupBy(data => new { data.ProductName})
.Select(group => new
{
_String = group.Key.ProductName,
Count = group.Count()
})
.FromCacheOnly();
}
OrderBy
(sowohl aufsteigend als auch absteigend) kann nur in einem LINQ-Ausdruck für verwendet werdenFromCacheOnly
WennGroupBy
wird eingesetzt.Mehr als eine
GroupBy
undOrderBy
Operatoren können nicht in einem einzelnen LINQ-Ausdruck für verwendet werdenFromCacheOnly
.Joins werden daher nicht unterstützt
Include()
Methode wird nicht funktionieren.Für LINQ-Ausdrücke, die das enthalten
DateTime
In allen Fällen müssen alle Knoten in einem Cache-Cluster über denselben Cache verfügenDateTime
Format eingerichtet. Andernfalls kommt es zu einer Formatausnahme. Dieses Problem tritt auf, wenn dieDateTime.Now
undDateTime.Parse()
Methoden werden in einem Cache-Cluster mit mehreren Knoten verwendet. Um dies zu vermeiden, synchronisieren Sie dieDateTime
Format auf beiden Maschinen. Darüber hinaus verwendenDateTime.ParseExact()
übrigDateTime.Parse()
, Da dieParseExact()
Die API hindert den Benutzer daran, ein Format für anzugebenDateTime
.Das
Like
Der Operator in EF Core führt einen Mustervergleich innerhalb von Zeichenfolgen durch. Normalerweise wird es mit eingesetztWhere
inSELECT
Anweisungen zum Filtern von Zeilen basierend auf bestimmten Mustern oder Teilzeichenfolgen innerhalb des Werts einer Spalte. Darüber hinaus ist die Verwendung von Platzhaltern möglich, um ein oder mehrere Zeichen in einer Zeichenfolge zu finden:
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCacheOnly()
.ToList();
}
- Das
Contains
Der Operator kann ähnlich wie der verwendet werdenLike
Operator, um musterbasierte Suchen innerhalb eines bestimmten Kriteriums durchzuführen.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCacheOnly()
}
- Das
Contains
Der Operator kann auch zum Durchsuchen eines Wörterbuchs verwendet werden.
using (var context = new NorthwindContext())
{
var customerList = new List<string> { "CustomerId", "Alfreds Futterkiste" };
var result = context.Customers
.Where(b => customerList.Contains(b.CompanyName))
.FromCacheOnly();
}
Asynchrone LINQ-APIs
Die asynchronen APIs verfügen über die gleiche Funktionalität wie ihre synchronen Gegenstücke, jedoch mit asynchronem Verhalten. Auch die an diese Methoden übergebenen Parameter sind dieselben.
Wichtig
Aufgrund seiner asynchronen Natur cacheKey
wird in keinem der asynchronen Aufrufe wie zurückgegeben FromCacheAsync
und LoadIntoCacheAsync
- wie out
Parameter sind bei Methoden mit asynchroner Signatur nicht zulässig.
FromCacheAsync
Wenn der Aufbau der Cache-Verbindung fehlschlägt, werden die Daten direkt aus der Datenbank abgerufen. Allerdings wird die Cache-Verbindung alle 60 Sekunden nach der Anforderung erneut versucht. Die nachfolgenden Anfragen versuchen, den Cache 60 Sekunden nach der letzten Anfrage neu zu initialisieren. Immer wenn eine Verbindung erfolgreich hergestellt wurde, werden die Daten aus dem Cache abgerufen.
Das folgende Beispiel ruft Kundendetails basierend auf einem angegebenen ab Kundennummer aus der Datenbank asynchron und speichert sie als separate Entität im Cache mit angegebenen Caching-Optionen.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
LoadIntoCacheAsync
Das folgende Beispiel lädt bestimmte Bestelldetails aus der Datenbank als separate Entitäten mit den angegebenen Caching-Optionen in den Cache.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCacheAsync(options);
task.Wait();
var resultSet = task.Result.ToList();
}
FromCacheOnlyAsync
Das folgende Beispiel ruft die Kundeninformationen nur dann aus dem Cache ab, wenn die Kundenfälle Entität existiert. Andernfalls ist die zurückgegebene Ergebnismenge leer, da die Datenbank ignoriert wird.
using (var context = new NorthwindContext())
{
var options = new CachingOptions
{
StoreAs = StoreAs.SeperateEntities
};
var task = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnlyAsync();
task.Wait();
var resultSet = task.Result.ToList();
}
Siehe auch
.NETZ: Alachisoft.NCache.EntityFrameworkCore Namespace.
.NETZ: Alachisoft.NCache.Runtime.Caching Namespace.