Skip to content

Commit 5740ed8

Browse files
[release/10.0] Fix named query filter conventions (#37738)
Fixes #37708 Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com>
1 parent 5f9c2c3 commit 5740ed8

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/EFCore/Metadata/Builders/EntityTypeBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ public virtual EntityTypeBuilder HasQueryFilter(LambdaExpression? filter)
822822
/// <returns>The same builder instance so that multiple configuration calls can be chained.</returns>
823823
public virtual EntityTypeBuilder HasQueryFilter(string filterKey, LambdaExpression? filter)
824824
{
825-
Builder.HasQueryFilter(new QueryFilter(filterKey, filter));
825+
Builder.HasQueryFilter(new QueryFilter(filterKey, filter, ConfigurationSource.Explicit));
826826

827827
return this;
828828
}

test/EFCore.Tests/Metadata/Internal/InternalEntityTypeBuilderTest.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3394,6 +3394,30 @@ public void Can_replace_named_query_filter_only_with_lower_or_equal_source()
33943394
Assert.NotEqual(filterExpression2, entityBuilder.Metadata.FindDeclaredQueryFilter(filterKey).Expression);
33953395
}
33963396

3397+
[ConditionalFact]
3398+
public void Can_override_named_query_filter_from_convention_with_explicit_configuration()
3399+
{
3400+
// This test verifies that named query filters set by conventions can be overridden by explicit configuration
3401+
var modelBuilder = CreateModelBuilder();
3402+
var entityBuilder = modelBuilder.Entity(typeof(Order), ConfigurationSource.Explicit);
3403+
3404+
LambdaExpression conventionFilter = (Order o) => o.Id == 1;
3405+
LambdaExpression explicitFilter = (Order o) => o.Id == 2;
3406+
const string filterKey = "testFilter";
3407+
3408+
// Convention sets a named query filter
3409+
entityBuilder.HasQueryFilter(new QueryFilter(filterKey, conventionFilter, ConfigurationSource.Convention));
3410+
Assert.Same(conventionFilter, entityBuilder.Metadata.FindDeclaredQueryFilter(filterKey).Expression);
3411+
Assert.Equal(ConfigurationSource.Convention, entityBuilder.Metadata.GetQueryFilterConfigurationSource(filterKey));
3412+
3413+
// Public API should be able to override it
3414+
var publicBuilder = new EntityTypeBuilder(entityBuilder.Metadata);
3415+
publicBuilder.HasQueryFilter(filterKey, explicitFilter);
3416+
// Verify the filter was replaced with the explicit one
3417+
Assert.Same(explicitFilter, entityBuilder.Metadata.FindDeclaredQueryFilter(filterKey).Expression);
3418+
Assert.Equal(ConfigurationSource.Explicit, entityBuilder.Metadata.GetQueryFilterConfigurationSource(filterKey));
3419+
}
3420+
33973421
private static TestLogger<DbLoggerCategory.Model, TestLoggingDefinitions> CreateTestLogger()
33983422
=> new() { EnabledFor = LogLevel.Warning };
33993423

0 commit comments

Comments
 (0)