Contains() is throwing an exception when used as follows:
var posts = await context.Post
.Where(x => blogs.Contains(x.Blog))
.ToListAsync();
Exception message: "Expression of type 'System.Collections.Generic.List1[System.Int32]' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable1System.Nullable1[System.Int32]]' of method 'Boolean Contains[Nullable1' (Parameter 'arg0')"
Stack trace: System.Dynamic.Utils.ExpressionUtils.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arguments, ParameterInfo pi, String methodParamName, String argumentParamName, Int32 index)\r\n at System.Linq.Expressions.Expression.Call(MethodInfo method, Expression arg0, Expression arg1)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityEqualityRewritingExpressionVisitor.VisitContainsMethodCall(MethodCallExpression methodCallExpression)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityEqualityRewritingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)\r\n at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)\r\n at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityEqualityRewritingExpressionVisitor.RewriteAndVisitLambda(LambdaExpression lambda, EntityReferenceExpression source)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityEqualityRewritingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)\r\n at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)\r\n at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityEqualityRewritingExpressionVisitor.Rewrite(Expression expression)\r\n at Microsoft.EntityFrameworkCore.Query.QueryOptimizer.Visit(Expression query)\r\n at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutorTResult\r\n at Microsoft.EntityFrameworkCore.Storage.Database.CompileQueryTResult\r\n at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCoreTResult\r\n at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_01.<ExecuteAsync>b__0()\r\n at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func1 compiler)\r\n at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryTResult
```c#
public class Blog
{
public int Id { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public Blog Blog { get; set; }
}
public class BloggingContext : DbContext
{
public DbSet<Blog> Blog { get; set; }
public DbSet<Post> Post { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test;ConnectRetryCount=0");
}
public class Program
{
public static async Task Main()
{
using (var context = new BloggingContext())
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
var blog1 = new Blog()
{
Posts = new List<Post>() { new Post(), new Post() }
};
context.Add(blog1);
context.SaveChanges();
}
using (var context = new BloggingContext())
{
var blogs = await context.Blog.ToListAsync();
var posts = await context.Post
.Where(x => blogs.Contains(x.Blog))
.ToListAsync();
}
}
}
```
EF Core version: 3.0.0-preview9.19405.9
Database Provider: Microsoft.EntityFrameworkCore.SqlServer
Operating system: Windows 10
IDE: Visual Studio 2019 16.3.0 Preview 1.0
@roji Is this an entity equality issue?
Sorry for missing this, will look into it tomorrow.
Repro'd in latest, bug introduced in #16957. Fix on the way.
Most helpful comment
Repro'd in latest, bug introduced in #16957. Fix on the way.