EF Core 3.1 не позволяет Содержит поиск по свойству Enum - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь выполнить поиск содержимого по свойству enum в моем DbSet, а EF Core 3.1 выдает следующую ошибку

Выражение LINQ 'DbSet .Where (d => d.Position.ToString (). Contains ("a cc")) 'не может быть переведено. Либо переписать запрос в форме, которую можно перевести, либо явным образом переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ()

Entity:

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

Enum - Position:

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
}

DbContext:

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) в моей базе данных.

enter image description here

enter image description here

Это не возможно? Если да, то можете ли вы помочь мне с объяснением?

1 Ответ

0 голосов
/ 03 мая 2020

Эта проблема была зарегистрирована в efcore github repo , и здесь есть обходной путь для этого сейчас. Свойство enum необходимо преобразовать в object, а затем в string

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

Надеюсь, это кому-то поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...