Skip to content

Commit

Permalink
Adding regression test for #18510 - InvalidOperationException : When …
Browse files Browse the repository at this point in the history
…called from 'VisitLambda', rewriting a node of type 'System.Linq.Expressions.ParameterExpression' must return a non-null value of the same type.

Issue was fixed earlier.

Resolves #18510
  • Loading branch information
maumar committed Jul 30, 2020
1 parent 2d5c580 commit 03a3173
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<MyEntity18510> Entities { get; set; }

public int TenantId { get; set; }

public MyContext18510(DbContextOptions options)
: base(options)
{
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity18510>().HasQueryFilter(x => x.Name != "Foo");

var entityType = modelBuilder.Model.GetEntityTypes().Single(et => et.ClrType == typeof(MyEntity18510));
var queryFilter = entityType.GetQueryFilter();
Expression<Func<int>> 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<TContext>(
Expand Down

0 comments on commit 03a3173

Please sign in to comment.