Skip to content

Instantly share code, notes, and snippets.

@ismkdc
Created April 19, 2023 11:49
Show Gist options
  • Save ismkdc/244ad15863fd61e44ac208409fab4a76 to your computer and use it in GitHub Desktop.
Save ismkdc/244ad15863fd61e44ac208409fab4a76 to your computer and use it in GitHub Desktop.
public static class EFQueryExtensions
{
public static async Task<T[]> ToArrayAsyncWithCache<T>(this IQueryable<T> query,
IRedisClient cache, string key, TimeSpan expire = default)
{
var cachedData = await cache.Db0.GetAsync<T[]>(key, CommandFlags.PreferReplica);
if (cachedData != null) return cachedData;
var data = await query.ToArrayAsync();
if (data.Length == 0) return data;
_ = expire == default
? cache.Db0.AddAsync(key, data)
: cache.Db0.AddAsync(key, data, expire);
return data;
}
public static async Task<T> FirstOrDefaultAsyncWithCache<T>(this IQueryable<T> query, IRedisClient cache,
string key, TimeSpan expire = default)
{
var cachedData = await cache.Db0.GetAsync<T>(key, CommandFlags.PreferReplica);
if (cachedData != null) return cachedData;
var data = await query.FirstOrDefaultAsync();
if (data == null) return default;
_ = expire == default
? cache.Db0.AddAsync(key, data)
: cache.Db0.AddAsync(key, data, expire);
return data;
}
public static async Task<T> SingleOrDefaultAsyncWithCache<T>(this IQueryable<T> query, IRedisClient cache,
string key, TimeSpan expire = default)
{
var cachedData = await cache.Db0.GetAsync<T>(key, CommandFlags.PreferReplica);
if (cachedData != null) return cachedData;
var data = await query.SingleOrDefaultAsync();
if (data == null) return default;
_ = expire == default
? cache.Db0.AddAsync(key, data)
: cache.Db0.AddAsync(key, data, expire);
return data;
}
public static async Task<bool> AnyAsyncWithCache<T>(this IQueryable<T> query, IRedisClient cache,
string key, TimeSpan expire = default)
{
var cachedData = await cache.Db0.GetAsync<bool?>(key, CommandFlags.PreferReplica);
if (cachedData != null) return cachedData.Value;
var data = await query.AnyAsync();
_ = expire == default
? cache.Db0.AddAsync(key, data)
: cache.Db0.AddAsync(key, data, expire);
return data;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment