Efcore: Contains() throws Exception Expression of type 'System.Collections.Generic.List`1[System.Int32]' cannot be used for parameter...

Created on 6 Aug 2019  路  3Comments  路  Source: dotnet/efcore

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

Steps to reproduce

```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();
        }
    }
}

```

Further technical details

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

closed-fixed customer-reported type-bug

Most helpful comment

Repro'd in latest, bug introduced in #16957. Fix on the way.

All 3 comments

@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.

Was this page helpful?
0 / 5 - 0 ratings