Skip to content

Parameter for collection of enum values contains ints even when correlated column has strings #30921

@ajcvickers

Description

@ajcvickers
using (var context = new SomeDbContext())
{
    context.Database.EnsureDeleted();
    context.Database.EnsureCreated();

    var terrains = new[] { Terrain.River, Terrain.Beach, Terrain.Park };
    var walksWithTerrain = await context.Walks
        .Where(e => terrains.Contains(e.Terrain))
        .ToListAsync();
}

public class DogWalk
{
    public int Id { get; set; }
    public Terrain Terrain { get; set; }
}

public enum Terrain
{
    Forest,
    River,
    Hills,
    Village,
    Park,
    Beach,
}

public class SomeDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseSqlServer(@"Data Source=(LocalDb)\MSSQLLocalDB;Database=AllTogetherNow")
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging();

    public DbSet<DogWalk> Walks => Set<DogWalk>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DogWalk>().Property(e => e.Terrain).HasConversion<string>();
    }
}

Parameter value below should be ["River", "Beach", "Park"]:

info: 5/18/2023 10:32:12.104 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
      Executed DbCommand (40ms) [Parameters=[@__terrains_0='[1,5,4]' (Size = 4000)], CommandType='Text', CommandTimeout='30']
      SELECT [w].[Id], [w].[Terrain]
      FROM [Walks] AS [w]
      WHERE EXISTS (
          SELECT 1
          FROM OpenJson(@__terrains_0) AS [t]
          WHERE [t].[value] = [w].[Terrain])

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions