【问题标题】:EF Core 3.1 does not allow Contains search on Enum propertyEF Core 3.1 不允许对枚举属性进行包含搜索
【发布时间】:2020-04-11 17:39:20
【问题描述】:

我正在尝试对我的 DbSet 中的 enum 属性进行包含搜索,而 EF Core 3.1 抛出以下错误

LINQ 表达式 'DbSet .Where(d => d.Position.ToString().Contains("acc"))' 无法翻译。 要么以可翻译的形式重写查询,要么切换 通过插入对任何一个的调用来明确地进行客户评估 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()

实体:

public class DemoEntity
{
    [Key]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Position Position { get; set; }
}

枚举 - 位置:

public enum Position
{
    [Display(Name = "Accountant")]
    Accountant,
    [Display(Name = "Chief Executive Officer (CEO)")]
    ChiefExecutiveOfficer,
    [Display(Name = "Integration Specialist")]
    IntegrationSpecialist,
    [Display(Name = "Junior Technical Author")]
    JuniorTechnicalAuthor,
    [Display(Name = "Pre Sales Support")]
    PreSalesSupport,
    [Display(Name = "Sales Assistant")]
    SalesAssistant,
    [Display(Name = "Senior Javascript Developer")]
    SeniorJavascriptDeveloper,
    [Display(Name = "Software Engineer")]
    SoftwareEngineer
}

数据库上下文:

public class DemoDbContext : DbContext
{
    public DemoDbContext(DbContextOptions options)
        : base(options) { }

    public DbSet<DemoEntity> Demos { get; set; }

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

当我按如下方式查询表时,出现错误

try
{
    var test = await _context.Demos.Where(x => x.Position.ToString().Contains("acc")).ToListAsync();
}
catch (System.Exception e)
{
    //throw;
}

我的数据库中的职位类型为NVARCHAR(MAX)

这不可能吗?如果是这样,请您帮我解释一下吗?

【问题讨论】:

    标签: c# enums entity-framework-core entity-framework-core-3.1


    【解决方案1】:

    此问题已在efcore github repo 中记录,现在是解决此问题的方法。 enum 属性需要转换为object,然后转换为string

    var test = await _context.Demos.Where(x => ((string) object)x.Position).Contains("acc")).ToListAsync();
    

    希望这对那里的人有所帮助。

    【讨论】:

    • 如果将 enum 的 int 值保存到 db ,这种方法是否有效?如果是 int 值,我们如何应用 where 条件
    • 它必须工作。您遇到什么错误?
    • system.invalidcastexception 无法将枚举类型的对象转换为“system.string”类型
    猜你喜欢
    • 2023-02-03
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多