Métodos de extensión de EF Core
NCache proporciona métodos de extensión sincrónicos y asincrónicos para almacenar en caché consultas en EF Core. Las API de sincronización son métodos de extensión para IQueryable
interfaz, mientras que las API asíncronas devuelven una instancia de tarea para estos métodos.
Note
Esta característica también está disponible en NCache Professional.
Para utilizar las siguientes API, incluya el siguiente espacio de nombres en su aplicación:
Alachisoft.NCache.EntityFrameworkCore
NCacheEl proveedor de almacenamiento en caché principal de Entity Framework contiene las siguientes API para consultas de almacenamiento en caché:
API síncronas | API asíncronas |
---|---|
FromCache |
FromCacheAsync |
LoadIntoCache |
LoadIntoCacheAsync |
FromCacheOnly |
FromCacheOnlyAsync |
FromCache
El método de extensión es ideal para usar cuando se manejan datos transaccionales (con operaciones frecuentes de lectura y escritura). Por ejemplo, mantener registros de vuelos, donde cada vuelo único requiere un registro continuo de nuevas entradas en la base de datos. Alternativamente, para datos de referencia (donde las lecturas son más frecuentes que las escrituras), utilice LoadIntoCache
y FromCacheOnly
métodos de extensión. Al igual que en un catálogo de productos, donde los productos se tratan como datos de referencia, ya que rara vez se modifican y se leen constantemente en la base de datos. Para utilizar estos métodos de extensión de datos de referencia, debe definir los índices de consulta dentro de su aplicación. Esto se puede hacer dinámicamente agregando el [QueryIndexable]
etiqueta.
Almacenamiento de datos de caché con EFCore
In FromCache
, LoadIntoCache
, FromCacheOnly
y sus contrapartes Async, puede usar las consultas de almacenamiento en caché de EF Core para almacenar datos en la caché para consultas posteriores.
Puede almacenar los datos en el caché de dos maneras: almacenar todo el conjunto de datos como una colección en una única clave en el almacén de datos mediante una llamada de inserción. O bien, puede agregar cada entidad por separado con varias claves de forma masiva. Puede realizar esta elección utilizando CachingOption StoreAs
establecido en StoreAs.Collection
or StoreAs.SeperateEntities
. Puede especificar y habilitar bulkInsertChunkSize
cuando se trata de una cantidad considerable de entidades, por ejemplo, 100,000. Esto garantiza que los datos se carguen en la caché fragmento por fragmento, independientemente del tamaño del conjunto de datos, lo que hace que el proceso de almacenamiento de datos sea más eficiente y manejable.
Note
El bulkInsertChunkSize
La propiedad divide la mayor parte de las entidades en fragmentos más pequeños y actualiza el caché fragmento por fragmento. Como tal, permite que la operación solucione el tiempo de espera de la conexión almacenando en caché una porción de entidades dentro del límite de 90 segundos, evitando que active el token de cancelación. Por defecto, el bulkInsertChunkSize
es 1000.
Importante:
Dado que la aplicación solo recibe una respuesta una vez que todo el volumen está almacenado en caché, es mejor utilizar un método de extensión Async para evitar retrasos significativos cuando se trata de un conjunto de datos grande.
DesdeCaché
El FromCache
El método almacena en caché los datos del conjunto de resultados generados en la consulta LINQ y los devuelve a la aplicación. Si los datos no existen en la caché, se recuperarán de la fuente de datos y se almacenarán en la caché. Si la aplicación vuelve a realizar la misma consulta, obtendrá los datos necesarios del caché, evitando un viaje innecesario a la fuente de datos.
Sin embargo, dado que este método se lleva a cabo en dos niveles (obtener los datos del conjunto de resultados y actualizar el caché), existe una mayor probabilidad de falla, especialmente en el último caso. Es posible que no pueda actualizar el caché debido a diversas razones. Por ejemplo, falla en la conexión de la base de datos, error de red, caché/servidor inactivo, falla al serializar los datos, un escenario de transferencia de estado, etc.
Por lo tanto, NCache proporciona a los usuarios que emplean FromCache
con el errorEnabled
bandera que les permite determinar si desean detener la aplicación por cualquier problema no relacionado con el conjunto de resultados. Generalmente, si el almacenamiento en caché y el rendimiento del sistema son una prioridad, los usuarios establecerán este indicador en Verdadero (de lo contrario, la consulta trata siempre con la fuente de datos). Sin embargo, si su prioridad es evitar que la aplicación se detenga, los usuarios establecerán este indicador en Falso.
Note
Por defecto, el errorEnabled
El indicador está establecido en Falso.
Note
Incluso si el errorEnabled
flag es False, estas excepciones relacionadas con la actualización de caché se registrarán en los registros de caché disponibles en %NCHome%/log-files
.
Ejemplos
- El siguiente ejemplo recupera los detalles del cliente basándose en un ID de cliente específico de la base de datos y los almacena como una entidad separada en caché con opciones de almacenamiento en caché especificadas.
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
También puede monitorear la actividad de su caché usando el NCache Monitor.
- El siguiente ejemplo devuelve la clave de caché generada internamente contra los datos del conjunto de resultados de la consulta almacenados como una colección en el caché. Esta clave se puede guardar para uso futuro, como eliminar la entidad/conjunto de resultados del caché.
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
Mediante el uso Exportar CacheKeys En la herramienta de su elección, puede ver las claves de caché de un caché en particular.
Consideraciones para FromCache
FromCache
soporta las siguientes funciones:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
FirstOrDefault
Las funciones se pueden implementar mientras se usa LINQ con FromCache
, como sigue:
- El
Like
El operador en EF Core realiza la coincidencia de patrones dentro de cadenas de caracteres. Generalmente se emplea conWhere
inSELECT
declaraciones para filtrar filas basadas en patrones o subcadenas específicas dentro del valor de una columna. Además, permite el uso de comodines para hacer coincidir uno o más caracteres en una cadena:
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCache(options)
.ToList();
}
- El
Contains
El operador se puede utilizar de forma similar alLike
operador emplear búsquedas basadas en patrones dentro de un criterio determinado.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCache(out cacheKey, options)
}
- El
FirstOrDefault
El operador se puede implementar como se muestra a continuación.
using (var context = new NorthwindContext())
{
var result = context.Products
.Where(b => b.UnitPrice > 1)
.FromCache(out cacheKey, options)
.FirstOrDefault();
}
- El
GroupBy
se puede utilizar con la proyección para FromCache como se implementa a continuación.
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();
}
Cargar en caché
El LoadIntoCache
La API recupera los datos del conjunto de resultados del origen y los almacena en caché sin devolverlos a la aplicación. Esta API permite posteriores FromCache
llamadas para obtener datos nuevos. El LoadIntoCache
El método es particularmente adecuado para datos que se actualizan con frecuencia, como pedidos de clientes, o datos confidenciales, como detalles de pago. En tales escenarios, el uso de datos obsoletos puede dar lugar a transacciones comerciales incorrectas, por lo que debe haber una copia nueva de los datos en la memoria caché en todo momento. Este método de extensión carga su conjunto completo de datos de trabajo en el caché. Luego, este método consulta la base de datos, almacena el resultado en la memoria caché y lo devuelve a la aplicación.
Ejemplos
- El siguiente ejemplo recupera los pedidos de los clientes de la base de datos y carga los datos del conjunto de resultados en la caché como una colección. También devuelve la clave de caché generada internamente que se puede guardar para uso futuro.
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);
}
- El siguiente ejemplo carga los detalles del pedido específico de la base de datos en la caché como entidades separadas con opciones de almacenamiento en caché especificadas.
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);
}
- El
GroupBy
Se puede utilizar con proyección paraLoadIntoCache
como se implementa a continuación.
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();
}
Puede ejecutar este método a intervalos regulares siempre que espere que los datos cambien. Por ejemplo, si prevé modificaciones de datos dentro de una semana, ejecutarlo nuevamente después de ese período garantiza que los datos en el caché se actualicen.
DesdeCacheOnly
Para los datos que se actualizan con menos frecuencia, como los detalles del cliente, recuperarlos periódicamente de la fuente de datos resulta costoso. FromCacheOnly
consulta las entidades presentes en la caché y no se acerca a la fuente de datos en ningún caso. Esencialmente, si la entidad no existe en la caché, aún así no se recuperará de la fuente de datos.
Note
Esta API solo funciona cuando las entidades se almacenan por separado, es decir, la opción de almacenamiento en caché StoreAs
se establece a SeperateEntities
.
Importante:
Las entidades deben estar indexadas en el NCache Centro de gestión antes de utilizarlos con FromCacheOnly
.
- El siguiente ejemplo obtiene la información del cliente del caché si el Local entidad existe. De lo contrario, el conjunto de resultados devuelto estará vacío.
using (var context = new NorthwindContext())
{
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnly();
}
Consideraciones para FromCacheOnly
FromCacheOnly
admite funciones agregadas. Sin embargo, estas funciones sólo almacenan en caché el resultado y no las entidades mismas. Por eso, NCache proporciona QueryDeferred
Método que difiere la consulta para que las entidades en el caché obtengan el resultado en respuesta a una consulta. Para obtener más detalles sobre las API diferidas, consulte el capítulo API de consultas diferidas. FromCacheOnly
soporta las siguientes funciones:
Group By
Order By Ascending
Order By Descending
Sum
Min
Max
Average
Count
Contains
Like
Tenga en cuenta las siguientes consideraciones al utilizar LINQ con FromCacheOnly
:
Excepto por
Count
, todas las funciones agregadas deben tener valores enteros.Count
necesita estar provisto de una entidad para contar.Una única expresión LINQ para
FromCacheOnly
No se puede utilizar más de una función agregada.Las proyecciones en expresiones LINQ sólo se pueden realizar si
GroupBy
El operador y una función agregada se utilizan paraFromCacheOnly
.No se admiten múltiples proyecciones. Sólo se puede proyectar un atributo en una expresión LINQ (que se traslada hacia adelante).
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
se usa principalmente para agregar funciones (agrupar el resultado de consultas usando columnas) y solo se puede usar si la proyección se completa de antemano y se usa una función agregada.GroupBy
tiene que ser el último operador en la expresión LINQ excepto siOrderBy
se utiliza. En tales casos, elGroupBy
La función se puede desplazar hacia adelante (después deOrderBy
) o al revés (antesOrderBy
).
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
(tanto ascendente como descendente) sólo se puede utilizar en una expresión LINQ paraFromCacheOnly
, SiGroupBy
se utiliza.Más de uno
GroupBy
yOrderBy
Los operadores no se pueden utilizar en una sola expresión LINQ paraFromCacheOnly
.Las uniones no son compatibles, por lo que el
Include()
El método no funcionará.Para expresiones LINQ que contienen el
DateTime
instancias, todos los nodos en un clúster de caché deben tener el mismoDateTime
configuración del formato. De lo contrario, se producirá una excepción de formato. Este problema surge cuando elDateTime.Now
yDateTime.Parse()
Los métodos se utilizan en un clúster de caché de múltiples nodos. Para evitarlo, sincronice elDateTime
formato en ambas máquinas. Además, utiliceDateTime.ParseExact()
Más deDateTime.Parse()
, Como elParseExact()
API restringe al usuario de especificar un formato paraDateTime
.El
Like
El operador en EF Core realiza la coincidencia de patrones dentro de cadenas de caracteres. Generalmente se emplea conWhere
inSELECT
declaraciones para filtrar filas basadas en patrones o subcadenas específicas dentro del valor de una columna. Además, permite el uso de comodines para hacer coincidir uno o más caracteres en una cadena:
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(c => EF.Functions.Like(c.CompanyName, "Alfreds Futterkiste"))
.FromCacheOnly()
.ToList();
}
- El
Contains
El operador se puede utilizar de forma similar alLike
operador emplear búsquedas basadas en patrones dentro de un criterio determinado.
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCacheOnly()
}
- El
Contains
El operador también se puede utilizar para buscar en un diccionario.
using (var context = new NorthwindContext())
{
var customerList = new List<string> { "CustomerId", "Alfreds Futterkiste" };
var result = context.Customers
.Where(b => customerList.Contains(b.CompanyName))
.FromCacheOnly();
}
API de LINQ asíncronas
Las API asíncronas tienen la misma funcionalidad que sus contrapartes síncronas, pero con un comportamiento asíncrono. Los parámetros pasados a estos métodos también son los mismos.
Importante:
Debido a su naturaleza asincrónica, cacheKey
no se devuelve en ninguna de las llamadas asincrónicas como FromCacheAsync
y LoadIntoCacheAsync
- como out
los parámetros no están permitidos con métodos con firma asíncrona.
DesdeCacheAsync
Los datos se obtienen directamente de la base de datos si falla el establecimiento de la conexión de caché. Sin embargo, cada 60 segundos desde que se realiza la solicitud, se vuelve a intentar la conexión de caché. Las solicitudes posteriores intentarán reinicializar el caché después de 60 segundos de la última solicitud. Siempre que se establece una conexión exitosamente, los datos se recuperan del caché.
El siguiente ejemplo obtiene los detalles del cliente en función de un determinado Identificación del cliente de la base de datos de forma asincrónica y los almacena como una entidad separada en el caché con opciones de almacenamiento en caché especificadas.
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();
}
Cargar en cachéAsync
El siguiente ejemplo carga detalles de pedidos específicos de la base de datos en la caché como entidades separadas con las opciones de almacenamiento en caché especificadas.
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();
}
DesdeCacheOnlyAsync
El siguiente ejemplo recupera la información del cliente solo del caché si el Local entidad existe. De lo contrario, el conjunto de resultados devuelto estará vacío, ya que se ignora la base de datos.
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();
}
Vea también
.NETO: Alachisoft.NCache.EntityFrameworkCore espacio de nombres
.NETO: Alachisoft.NCache.Runtime.Caching espacio de nombres