EF Core: фильтрация запросов по сложному свойству (в котором используется настраиваемый преобразователь значений) - PullRequest
0 голосов
/ 25 апреля 2020

ребята.

Сейчас я использую EF Core 3.1 в качестве поставщика моей базы данных. Итак, давайте представим простую модель пользователя с различными рабочими ролями (например, «работник», «строитель», «поддерживается» и т. Д. c.)

public enum Roles
{
   Worker = 1,
   Builder = 2,
   Supporter = 3
}

public class User
{
    public Guid Id { get; set; }
    public ICollection<Roles> EmploymentRoles { get; set; }
    ...
}

с DbContext

...
DbSet<User> Users { get; set; }
...
modelBuilder.Entity<User>().Property(f => f.EmploymentRoles).HasConversion(new JsonEnumCollectionToStringConverter<Roles>()); 

    public class JsonEnumCollectionToStringConverter<T> : ValueConverter<ICollection<T>, string> where T : Enum
    {
        public JsonEnumCollectionToStringConverter() :base(entity => JsonConvert.SerializeObject(entity), value => JsonConvert.DeserializeObject<ICollection<T>>(value))
        {
        }
    }

Таким образом, невозможно написать запрос фильтра прямо так:

var users = dbContext.Users.Where(e => e.EmploymentRoles.Contains(Roles.Worker)).ToList();

, потому что EF Core не может преобразовать Custom ValueConverter в SQL и выполнить его на стороне сервера. В 3.1.x до сих пор нет предупреждений, но этот код поймает ошибку в 5.x. NET.

Итак, как правильно написать этот фильтр правильно? Я не хочу захватывать целых пользователей и фильтровать их на стороне клиента, это может ухудшить производительность.

Спасибо.

...