Skip to content

Commit deb7fa0

Browse files
authored
Fixing named query cache misses by adding support for collections in constant expression comparer (#37221)
1 parent 4d18ebc commit deb7fa0

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ namespace Microsoft.EntityFrameworkCore;
2525
+ "from user code - so it's never trimmed.")]
2626
public static class EntityFrameworkQueryableExtensions
2727
{
28+
private static readonly bool UseOldBehavior37112 =
29+
AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue37112", out var enabled) && enabled;
30+
2831
/// <summary>
2932
/// Generates a string representation of the query used. This string may not be suitable for direct execution and is intended only
3033
/// for use in debugging.
@@ -2710,7 +2713,9 @@ public static IQueryable<TEntity> IgnoreQueryFilters<TEntity>(
27102713
Expression.Call(
27112714
instance: null,
27122715
method: IgnoreNamedQueryFiltersMethodInfo.MakeGenericMethod(typeof(TEntity)),
2713-
arguments: [source.Expression, Expression.Constant(filterKeys)]))
2716+
arguments: UseOldBehavior37112
2717+
? [source.Expression, Expression.Constant(filterKeys)]
2718+
: [source.Expression, Expression.Constant(filterKeys is string[]? filterKeys : filterKeys.ToArray())]))
27142719
: source;
27152720

27162721
#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)