Skip to content

Commit e199af0

Browse files
Update source
Update source
1 parent 5220b68 commit e199af0

File tree

13 files changed

+132
-16
lines changed

13 files changed

+132
-16
lines changed

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/DbRawSqlQuery/FromCache.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public static IEnumerable<T> FromCache<T>(this DbRawSqlQuery<T> query, CacheItem
5151
{
5252
item = query.ToList();
5353
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
54-
QueryCacheManager.AddCacheTag(handler, key, tags);
54+
QueryCacheManager.AddCacheTag(handler, key, tags);
55+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
5556
}
5657
}
5758

@@ -85,6 +86,7 @@ public static IEnumerable<T> FromCache<T>(this DbRawSqlQuery<T> query, DateTimeO
8586
item = query.ToList();
8687
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
8788
QueryCacheManager.AddCacheTag(handler, key, tags);
89+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
8890
}
8991
}
9092

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Data.Common;
2+
using System.Reflection;
3+
#if EFCORE
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Infrastructure;
6+
using Microsoft.EntityFrameworkCore.Storage;
7+
#elif EF6 || EF5 || EFCLASSIC
8+
using System.Data.Entity;
9+
#endif
10+
namespace Z.EntityFramework.Plus
11+
{
12+
public static partial class DbSetExtensions
13+
{
14+
/// <summary>A DbSet&lt;T&gt; extension method that expire cache.</summary>
15+
/// <param name="dbSet">The dbSet to act on.</param>
16+
public static void ExpireCache<T>(this DbSet<T> dbSet) where T : class
17+
{
18+
QueryCacheManager.ExpireType(typeof(T));
19+
}
20+
}
21+
}

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/DbSqlQuery/FromCache.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public static IEnumerable<T> FromCache<T>(this DbSqlQuery<T> query, CacheItemPol
5252
item = query.AsNoTracking().ToList();
5353
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
5454
QueryCacheManager.AddCacheTag(handler, key, tags);
55+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
5556
}
5657
}
5758

@@ -85,6 +86,7 @@ public static IEnumerable<T> FromCache<T>(this DbSqlQuery<T> query, DateTimeOffs
8586
item = query.AsNoTracking().ToList();
8687
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
8788
QueryCacheManager.AddCacheTag(handler, key, tags);
89+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
8890
}
8991
}
9092

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/IQueryable`/FromCache.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,13 @@ public static IEnumerable<T> FromCache<T>(this IQueryable<T> query, CacheItemPol
5454
item = query.AsNoTracking().ToList();
5555
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
5656
QueryCacheManager.AddCacheTag(handler, key, tags);
57+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
5758
}
5859
#else
5960
item = query.AsNoTracking().ToList();
6061
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
6162
QueryCacheManager.AddCacheTag(key, tags);
63+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
6264
#endif
6365
}
6466

@@ -96,11 +98,13 @@ public static IEnumerable<T> FromCache<T>(this IQueryable<T> query, DateTimeOffs
9698
item = query.AsNoTracking().ToList();
9799
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
98100
QueryCacheManager.AddCacheTag(handler, key, tags);
101+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
99102
}
100103
#else
101104
item = query.AsNoTracking().ToList();
102105
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
103106
QueryCacheManager.AddCacheTag(key, tags);
107+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
104108
#endif
105109
}
106110

@@ -150,6 +154,7 @@ public static IEnumerable<T> FromCache<T>(this IQueryable<T> query, MemoryCacheE
150154
item = query.AsNoTracking().ToList();
151155
item = QueryCacheManager.Cache.Set(key, item, options);
152156
QueryCacheManager.AddCacheTag(key, tags);
157+
QueryCacheManager.AddCacheTag(key,typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
153158
}
154159

155160
item = item.IfDbNullThenNull();

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/IQueryable`/FromCacheAsync.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public static Task<IEnumerable<T>> FromCacheAsync<T>(this IQueryable<T> query, C
5858
item = query.AsNoTracking().ToList();
5959
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
6060
QueryCacheManager.AddCacheTag(key, tags);
61+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
6162
}
6263

6364
return (IEnumerable<T>) item;
@@ -98,6 +99,7 @@ public static Task<IEnumerable<T>> FromCacheAsync<T>(this IQueryable<T> query, D
9899
item = query.AsNoTracking().ToList();
99100
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
100101
QueryCacheManager.AddCacheTag(key, tags);
102+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
101103
}
102104

103105
return (IEnumerable<T>) item;
@@ -153,6 +155,7 @@ public static Task<IEnumerable<T>> FromCacheAsync<T>(this IQueryable<T> query, p
153155
item = await query.AsNoTracking().ToListAsync(cancellationToken).ConfigureAwait(false);
154156
item = QueryCacheManager.AddOrGetExisting(key, item, policy) ?? item;
155157
QueryCacheManager.AddCacheTag(handler, key, tags);
158+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
156159
}
157160
}
158161

@@ -207,6 +210,7 @@ public static Task<IEnumerable<T>> FromCacheAsync<T>(this IQueryable<T> query, C
207210
item = await query.AsNoTracking().ToListAsync(cancellationToken).ConfigureAwait(false);
208211
item = QueryCacheManager.AddOrGetExisting(key, item, absoluteExpiration) ?? item;
209212
QueryCacheManager.AddCacheTag(handler, key, tags);
213+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
210214
}
211215
}
212216

@@ -291,6 +295,7 @@ public static Task<IEnumerable<T>> FromCacheAsync<T>(this IQueryable<T> query, p
291295
item = await query.AsNoTracking().ToListAsync(cancellationToken).ConfigureAwait(false);
292296
item = QueryCacheManager.Cache.Set(key, item, options);
293297
QueryCacheManager.AddCacheTag(key, tags);
298+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
294299
}
295300

296301
item = item.IfDbNullThenNull();

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/QueryDeferred`/FromCache.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ public static T FromCache<T>(this QueryDeferred<T> query, CacheItemPolicy policy
5252

5353
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, policy) ?? item;
5454
QueryCacheManager.AddCacheTag(handler, key, tags);
55+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
5556
}
5657
#else
5758
item = query.Execute();
5859

5960
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, policy) ?? item;
6061
QueryCacheManager.AddCacheTag(key, tags);
62+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
6163
#endif
6264
}
6365

@@ -98,12 +100,14 @@ public static T FromCache<T>(this QueryDeferred<T> query, DateTimeOffset absolut
98100

99101
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, absoluteExpiration) ?? item;
100102
QueryCacheManager.AddCacheTag(handler, key, tags);
103+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
101104
}
102105
#else
103106
item = query.Execute();
104107

105108
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, absoluteExpiration) ?? item;
106109
QueryCacheManager.AddCacheTag(key, tags);
110+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
107111
#endif
108112
}
109113

@@ -156,6 +160,7 @@ public static T FromCache<T>(this QueryDeferred<T> query, MemoryCacheEntryOption
156160

157161
item = QueryCacheManager.Cache.Set(key, item ?? DBNull.Value, options);
158162
QueryCacheManager.AddCacheTag(key, tags);
163+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
159164
}
160165

161166
item = item.IfDbNullThenNull();

src/shared/Z.EF.Plus.QueryCache.Shared/Extensions/QueryDeferred`/FromCacheAsync.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static Task<T> FromCacheAsync<T>(this QueryDeferred<T> query, CacheItemPo
5656
item = query.Execute();
5757
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, policy) ?? item;
5858
QueryCacheManager.AddCacheTag(key, tags);
59+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
5960
}
6061

6162
item = item.IfDbNullThenNull();
@@ -99,6 +100,7 @@ public static Task<T> FromCacheAsync<T>(this QueryDeferred<T> query, DateTimeOff
99100
item = query.Execute();
100101
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, absoluteExpiration) ?? item;
101102
QueryCacheManager.AddCacheTag(key, tags);
103+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
102104
}
103105

104106
item = item.IfDbNullThenNull();
@@ -156,6 +158,7 @@ public static Task<T> FromCacheAsync<T>(this QueryDeferred<T> query, params stri
156158
item = await query.ExecuteAsync(cancellationToken).ConfigureAwait(false);
157159
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, policy) ?? item;
158160
QueryCacheManager.AddCacheTag(handler, key, tags);
161+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
159162
}
160163
}
161164

@@ -212,6 +215,7 @@ public static Task<T> FromCacheAsync<T>(this QueryDeferred<T> query, CacheItemPo
212215
item = await query.ExecuteAsync(cancellationToken).ConfigureAwait(false);
213216
item = QueryCacheManager.AddOrGetExistingDeferred<T>(key, item ?? DBNull.Value, absoluteExpiration) ?? item;
214217
QueryCacheManager.AddCacheTag(handler, key, tags);
218+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
215219
}
216220
}
217221

@@ -298,6 +302,7 @@ public static Task<T> FromCacheAsync<T>(this QueryDeferred<T> query, params stri
298302
item = await query.ExecuteAsync(cancellationToken).ConfigureAwait(false);
299303
item = QueryCacheManager.Cache.Set(key, item ?? DBNull.Value, options);
300304
QueryCacheManager.AddCacheTag(key, tags);
305+
QueryCacheManager.AddCacheTag(key, typeof(T).Name + QueryCacheManager.CacheTypeSuffix);
301306
}
302307

303308
item = item.IfDbNullThenNull();

src/shared/Z.EF.Plus.QueryCache.Shared/QueryCacheManager.cs

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ static QueryCacheManager()
5151
DefaultCacheItemPolicy = new CacheItemPolicy();
5252
#elif EFCORE
5353
Cache = new MemoryCache(new MemoryCacheOptions());
54-
DefaultMemoryCacheEntryOptions = new MemoryCacheEntryOptions();
54+
DefaultMemoryCacheEntryOptions = new MemoryCacheEntryOptions();
5555
#endif
5656
CachePrefix = "Z.EntityFramework.Plus.QueryCacheManager;";
57+
CacheTypeSuffix = "_ZZZ_QueryCacheManager_CacheType";
5758
CacheTags = new ConcurrentDictionary<string, List<string>>();
5859
IncludeConnectionInCacheKey = true;
5960
}
@@ -182,13 +183,17 @@ public static Func<MemoryCacheEntryOptions> MemoryCacheEntryOptionsFactory
182183
_memoryCacheEntryOptionsFactory = value;
183184
_defaultMemoryCacheEntryOptions = null;
184185
}
185-
}
186+
}
186187
#endif
187188

188189
/// <summary>Gets or sets the cache prefix to use to create the cache key.</summary>
189190
/// <value>The cache prefix to use to create the cache key.</value>
190191
public static string CachePrefix { get; set; }
191192

193+
/// <summary>Gets or sets the cache type suffix.</summary>
194+
/// <value>The cache type suffix.</value>
195+
public static string CacheTypeSuffix { get; set; }
196+
192197
/// <summary>Gets or sets the cache key factory.</summary>
193198
/// <value>The cache key factory.</value>
194199
public static Func<IQueryable, string[], string> CacheKeyFactory { get; set; }
@@ -347,7 +352,42 @@ public static void ExpireAll()
347352
Cache.Remove(item);
348353
}
349354
}
355+
#else
356+
/// <summary>Expire all cached objects && tag.</summary>
357+
public static void ExpireAll()
358+
{
359+
var tags = CacheTags.Select(x => x.Key).ToList();
360+
361+
// We do not use ExpireTag because type doesn't have CachePrefix
362+
foreach (var tag in tags)
363+
{
364+
List<string> list;
365+
if (CacheTags.TryRemove(tag, out list))
366+
{
367+
// never lock something related to this list elsewhere or ensure we don't create a deadlock
368+
lock (list)
369+
{
370+
foreach (var item in list)
371+
{
372+
Cache.Remove(item);
373+
}
374+
}
375+
}
376+
}
377+
}
350378
#endif
379+
/// <summary>Expire type.</summary>
380+
/// <param name="type">The type.</param>
381+
public static void ExpireType(Type type)
382+
{
383+
ExpireTag(type.Name + CacheTypeSuffix);
384+
}
385+
386+
/// <summary>Expire type.</summary>
387+
public static void ExpireType<T>()
388+
{
389+
ExpireType(typeof(T));
390+
}
351391

352392
/// <summary>Expire all cached keys linked to specified tags.</summary>
353393
/// <param name="tags">
@@ -371,7 +411,7 @@ public static void ExpireTag(params string[] tags)
371411
}
372412
}
373413
}
374-
}
414+
}
375415

376416
/// <summary>Gets cached keys used to cache or retrieve a query from the QueryCacheManager.</summary>
377417
/// <param name="query">The query to cache or retrieve from the QueryCacheManager.</param>

src/shared/Z.EF.Plus.QueryCache.Shared/Z.EF.Plus.QueryCache.Shared.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<Import_RootNamespace>Z.EF.Plus.QueryCache.Shared</Import_RootNamespace>
1717
</PropertyGroup>
1818
<ItemGroup>
19+
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DbSet\ExpireType.cs" />
1920
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DbRawSqlQuery\FromCache.cs" />
2021
<Compile Include="$(MSBuildThisFileDirectory)Extensions\DbSqlQuery\FromCache.cs" />
2122
<Compile Include="$(MSBuildThisFileDirectory)Extensions\IQueryable`\FromCache.cs" />

src/shared/Z.EF.Plus.QueryDeferred.Shared/QueryDeferred.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using System.Data.Entity.Infrastructure;
2121

2222
#elif EFCORE
23+
using Microsoft.EntityFrameworkCore.Query;
2324
using Microsoft.EntityFrameworkCore.Query.Internal;
2425

2526
#endif

0 commit comments

Comments
 (0)