Skip to content

Commit 5544d0f

Browse files
authored
Fixing named query cache misses by adding support for collections in constant expression comparer (#37150)
1 parent fe9cccd commit 5544d0f

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2710,7 +2710,9 @@ public static IQueryable<TEntity> IgnoreQueryFilters<TEntity>(
27102710
Expression.Call(
27112711
instance: null,
27122712
method: IgnoreNamedQueryFiltersMethodInfo.MakeGenericMethod(typeof(TEntity)),
2713-
arguments: [source.Expression, Expression.Constant(filterKeys)]))
2713+
// converting the collection to an array if it isn't already one to ensure consistent caching. Fixes #37112.
2714+
// #37212 may be a possible future solution providing broader capabilities around parameterizing collections.
2715+
arguments: [source.Expression, Expression.Constant(filterKeys is string[] ? filterKeys : filterKeys.ToArray())]))
27142716
: source;
27152717

27162718
#endregion

test/EFCore.Specification.Tests/Query/AdHocQueryFiltersQueryTestBase.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,31 @@ public virtual async Task Named_query_filters_ignore_some()
3434
Assert.Equal(2, result.Count);
3535
}
3636

37+
[ConditionalFact]
38+
public virtual async Task Named_query_filters_caching()
39+
{
40+
var cacheLog = new List<string>();
41+
var contextFactory = await InitializeAsync<Context8576_NamedFilters>(seed: c => c.SeedAsync(), onConfiguring: builder =>
42+
{
43+
builder.EnableSensitiveDataLogging();
44+
builder.LogTo(cacheLog.Add, filter: (eventid, _) => eventid.Name == CoreEventId.QueryCompilationStarting.Name);
45+
});
46+
using var context = contextFactory.CreateContext();
47+
_ = context.Entities
48+
.IgnoreQueryFilters(["ActiveFilter", "NameFilter"])
49+
.ToList();
50+
_ = context.Entities
51+
.IgnoreQueryFilters(["ActiveFilter", "NameFilter"])
52+
.ToList();
53+
_ = context.Entities
54+
.IgnoreQueryFilters(["NameFilter", "ActiveFilter"])
55+
.ToList();
56+
57+
// #37212 - ExpressionEqualityComparer doesn't support collections besides an array,
58+
// therefore we can't implement caching for different order of ignored filters
59+
Assert.Equal(2, cacheLog.Count);
60+
}
61+
3762
[ConditionalFact]
3863
public virtual async Task Named_query_filters_ignore_all()
3964
{

0 commit comments

Comments
 (0)