人。
我现在将EF Core 3.1用作数据库提供程序。因此,让我们想象一个具有不同工作角色(例如“工作人员”,“构建人员”,“受支持的人员”等)的简单用户模型。
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中捕获错误。
那么,正确编写此过滤器查询的好方法是什么?我不想吸引整个用户并在客户端对其进行过滤,因此性能可能会变差。
谢谢。