ребята.
Сейчас я использую 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.
Итак, как правильно написать этот фильтр правильно? Я не хочу захватывать целых пользователей и фильтровать их на стороне клиента, это может ухудшить производительность.
Спасибо.