Skip to content

Contains call fails with System.InvalidCastException: Object must implement IConvertible if array contains null in 10.0.2 #37537

@pavel-bstk

Description

@pavel-bstk

Bug description

Starting 10.0.2, the following code fails with System.InvalidCastException

var targetValue = new int?[] { null, 123 };

db.SampleEntities
    .Where(e => targetValue.Contains(e.SampleField))

if ParameterTranslationMode set to Parameter

Works fine in 10.0.1.

Your code

public class SampleEntity
{
    public int Id { get; set; }

    public int? SampleField { get; set; }
}

public class AppDbContext : DbContext
{
    public DbSet<SampleEntity> SampleEntities => Set<SampleEntity>();

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(
                "Server=.;Database=sample;Trusted_Connection=True;TrustServerCertificate=True", options =>
                {
                    options.UseParameterizedCollectionMode(ParameterTranslationMode.Parameter);
                });
        }
    }
}

///
using var db = new AppDbContext();

var targetValue = new int?[] { null, 123 };

// works in 10.0.1
// fails in 10.0.2
db.SampleEntities
    .Where(e => targetValue.Contains(e.SampleField))
    .ToList();

Stack traces

Unhandled exception. System.InvalidCastException: Object must implement IConvertible.
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter`2.Sanitize[T](Object value)
   at Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter`2.<>c__DisplayClass2_0`2.<SanitizeConverter>b__1(Object v)
   at Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping.CreateParameter(DbCommand command, String name, Object value, Nullable`1 nullable, ParameterDirection direction)
   at Microsoft.EntityFrameworkCore.Storage.Internal.TypeMappedRelationalParameter.AddDbParameter(DbCommand command, Object value)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBase.AddDbParameter(DbCommand command, IReadOnlyDictionary`2 parameterValues)     
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.CreateDbCommand(RelationalCommandParameterObject parameterObject, Guid commandId, DbCommandMethod commandMethod)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)        
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Program.<Main>$(String[] args) in D:\Projects\eftest\Program.cs:line 19

Verbose output


EF Core version

10.0.2

Database provider

Microsoft.EntityFrameworkCore.SqlServer

Target framework

.net 10

Operating system

Windows 11

IDE

dotnet cli

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions