diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs index 06d0bb62d76..8d1b1291209 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs @@ -8103,6 +8103,101 @@ private SqlServerTestStore CreateDatabase19206() #endregion + + #region Issue 18510 + + [ConditionalFact] + public virtual void Invoke_inside_query_filter_gets_correctly_evaluated_during_translation() + { + using (CreateDatabase18510()) + { + using var context = new MyContext18510(_options); + + context.TenantId = 1; + var query1 = context.Entities.ToList(); + Assert.True(query1.All(x => x.TenantId == 1)); + + context.TenantId = 2; + var query2 = context.Entities.ToList(); + Assert.True(query2.All(x => x.TenantId == 2)); + + AssertSql( + @"@__ef_filter__p_0='1' + +SELECT [e].[Id], [e].[Name], [e].[TenantId] +FROM [Entities] AS [e] +WHERE (([e].[Name] <> N'Foo') OR [e].[Name] IS NULL) AND ([e].[TenantId] = @__ef_filter__p_0)", + // + @"@__ef_filter__p_0='2' + +SELECT [e].[Id], [e].[Name], [e].[TenantId] +FROM [Entities] AS [e] +WHERE (([e].[Name] <> N'Foo') OR [e].[Name] IS NULL) AND ([e].[TenantId] = @__ef_filter__p_0)"); + } + } + + public class MyEntity18510 + { + public int Id { get; set; } + public string Name { get; set; } + + public int TenantId { get; set; } + } + + private class MyContext18510 : DbContext + { + public DbSet Entities { get; set; } + + public int TenantId { get; set; } + + public MyContext18510(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasQueryFilter(x => x.Name != "Foo"); + + var entityType = modelBuilder.Model.GetEntityTypes().Single(et => et.ClrType == typeof(MyEntity18510)); + var queryFilter = entityType.GetQueryFilter(); + Expression> tenantFunc = () => TenantId; + var tenant = Expression.Invoke(tenantFunc); + + var efPropertyMethod = typeof(EF).GetTypeInfo().GetDeclaredMethod(nameof(EF.Property)).MakeGenericMethod(typeof(int)); + var prm = queryFilter.Parameters[0]; + var efPropertyMethodCall = Expression.Call(efPropertyMethod, prm, Expression.Constant("TenantId")); + + var updatedQueryFilter = Expression.Lambda( + Expression.AndAlso( + queryFilter.Body, + Expression.Equal( + efPropertyMethodCall, + tenant)), + prm); + + entityType.SetQueryFilter(updatedQueryFilter); + } + } + + private SqlServerTestStore CreateDatabase18510() + => CreateTestStore( + () => new MyContext18510(_options), + context => + { + var e1 = new MyEntity18510 { Name = "e1", TenantId = 1 }; + var e2 = new MyEntity18510 { Name = "e2", TenantId = 2 }; + var e3 = new MyEntity18510 { Name = "e3", TenantId = 2 }; + var e4 = new MyEntity18510 { Name = "Foo", TenantId = 2 }; + + context.Entities.AddRange(e1, e2, e3, e4); + context.SaveChanges(); + + ClearLog(); + }); + + #endregion + private DbContextOptions _options; private SqlServerTestStore CreateTestStore(