diff --git a/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs index 0602cf9ea5b..e0b46b489b0 100644 --- a/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs +++ b/src/EFCore/Extensions/EntityFrameworkQueryableExtensions.cs @@ -25,6 +25,9 @@ namespace Microsoft.EntityFrameworkCore; + "from user code - so it's never trimmed.")] public static class EntityFrameworkQueryableExtensions { + private static readonly bool UseOldBehavior37112 = + AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue37112", out var enabled) && enabled; + /// /// Generates a string representation of the query used. This string may not be suitable for direct execution and is intended only /// for use in debugging. @@ -2710,7 +2713,9 @@ public static IQueryable IgnoreQueryFilters( Expression.Call( instance: null, method: IgnoreNamedQueryFiltersMethodInfo.MakeGenericMethod(typeof(TEntity)), - arguments: [source.Expression, Expression.Constant(filterKeys)])) + arguments: UseOldBehavior37112 + ? [source.Expression, Expression.Constant(filterKeys)] + : [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() {