diff --git a/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs index 0602cf9ea5b..ff42ac5b095 100644 --- a/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs +++ b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs @@ -2710,7 +2710,9 @@ public static IQueryable IgnoreQueryFilters( Expression.Call( instance: null, method: IgnoreNamedQueryFiltersMethodInfo.MakeGenericMethod(typeof(TEntity)), - arguments: [source.Expression, Expression.Constant(filterKeys)])) + // converting the collection to an array if it isn't already one to ensure consistent caching. Fixes #37112. + // #37212 may be a possible future solution providing broader capabilities around parameterizing collections. + arguments: [source.Expression, Expression.Constant(filterKeys is string[] ? filterKeys : filterKeys.ToArray())])) : source; #endregion diff --git a/test/EFCore.Specification.Tests/Query/AdHocQueryFiltersQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/AdHocQueryFiltersQueryTestBase.cs index 412b9508dd2..c84d80fef18 100644 --- a/test/EFCore.Specification.Tests/Query/AdHocQueryFiltersQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/AdHocQueryFiltersQueryTestBase.cs @@ -34,6 +34,31 @@ public virtual async Task Named_query_filters_ignore_some() Assert.Equal(2, result.Count); } + [ConditionalFact] + public virtual async Task Named_query_filters_caching() + { + var cacheLog = new List(); + var contextFactory = await InitializeAsync(seed: c => c.SeedAsync(), onConfiguring: builder => + { + builder.EnableSensitiveDataLogging(); + builder.LogTo(cacheLog.Add, filter: (eventid, _) => eventid.Name == CoreEventId.QueryCompilationStarting.Name); + }); + using var context = contextFactory.CreateContext(); + _ = context.Entities + .IgnoreQueryFilters(["ActiveFilter", "NameFilter"]) + .ToList(); + _ = context.Entities + .IgnoreQueryFilters(["ActiveFilter", "NameFilter"]) + .ToList(); + _ = context.Entities + .IgnoreQueryFilters(["NameFilter", "ActiveFilter"]) + .ToList(); + + // #37212 - ExpressionEqualityComparer doesn't support collections besides an array, + // therefore we can't implement caching for different order of ignored filters + Assert.Equal(2, cacheLog.Count); + } + [ConditionalFact] public virtual async Task Named_query_filters_ignore_all() {