EF Core:按复杂属性过滤查询(使用自定义值转换器)

时间:2020-04-25 00:48:28

标签: .net-core ef-core-3.1

人。

我现在将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中捕获错误。

那么,正确编写此过滤器查询的好方法是什么?我不想吸引整个用户并在客户端对其进行过滤,因此性能可能会变差。

谢谢。

0 个答案:

没有答案