C# 在属性getter中使用automapper

C# 在属性getter中使用automapper,c#,entity-framework-core,automapper,ef-core-3.1,C#,Entity Framework Core,Automapper,Ef Core 3.1,在将EF Core版本升级到3.x之后,automapper projections无法再工作,因为不再允许客户端求值,并且projection logic使用一些计算属性 我试图将投影逻辑一分为二,这样它就可以投影除计算属性之外的所有内容 public class User { public string RolesJson { get; set; } [NotMapped] public List<Role> Roles => JsonConvert.Des

在将EF Core版本升级到3.x之后,automapper projections无法再工作,因为不再允许客户端求值,并且projection logic使用一些计算属性

我试图将投影逻辑一分为二,这样它就可以投影除计算属性之外的所有内容

public class User
{
    public string RolesJson { get; set; }
    [NotMapped] public List<Role> Roles => JsonConvert.DeserializeObject<List<Role>>(RolesJson);
}

public class Role
{
    public string Name { get; set; }
    public DateTime? ExpireAt { get; set; }
}

public class UserViewModel
{
    public List<RoleViewModel> Roles { get; set; }
    public string RolesJson { get; set; }

    // Can't use this due to the logic in Role->RoleViewModel conversion
    //public List<RoleViewModel> Roles {
    //    get => JsonConvert.DeserializeObject<List<RoleViewModel>>(RolesJson);
    //    set { Roles = value; }
    //}
}

public class RoleViewModel
{
    public string Name { get; set; }
    public DateTime ExpireAt { get; set; }
}
公共类用户
{
公共字符串RolesJson{get;set;}
[NotMapped]公共列表角色=>JsonConvert.DeserializeObject(RolesJson);
}
公共阶级角色
{
公共字符串名称{get;set;}
公共日期时间?过期{get;set;}
}
公共类UserViewModel
{
公共列表角色{get;set;}
公共字符串RolesJson{get;set;}
//由于Role->RoleViewModel转换中的逻辑,无法使用此选项
//公共列表角色{
//get=>JsonConvert.DeserializeObject(RolesJson);
//设置{Roles=value;}
//}
}
公共类角色视图模型
{
公共字符串名称{get;set;}
公共日期时间过期{get;set;}
}
下面是MapperProfile

// Can't use this because it needs client evaluation
CreateMap<User, UserViewModel>()
    .ForMember(dest => dest.Roles, 
               opt => opt.MapFrom(src => src.Roles.OrderBy(r => r.Name)));

CreateMap<Role, RoleViewModel>()
    .ForMember(dest => dest.ExpireAt,
               opt => opt.MapFrom(src => src.ExpireAt ?? DateTime.MaxValue));
//无法使用此选项,因为它需要客户端评估
CreateMap()
.FormMember(目标=>目标角色,
opt=>opt.MapFrom(src=>src.Roles.OrderBy(r=>r.Name));
CreateMap()
.ForMember(dest=>dest.ExpireAt,
opt=>opt.MapFrom(src=>src.ExpireAt??DateTime.MaxValue));
是否有任何方法可以从MapperProfile重写UserViewModel的角色获取方法(注释导出的代码),使其在执行此操作时使用角色->角色视图模型转换逻辑?或者我可以将IMapper注入到属性getter中吗

顺便说一句,我通过引入一个模型类来实现这一点。我可以这样做,使用ProjectTo()方法进行User->UserProjectModel(这没有任何不可转换的表达式)转换,然后使用Map()方法进行UserProjectModel->UserViewModel转换。然而,这是非常昂贵的,因为有很多视图模型相互引用,而其中一些需要客户端评估,而另一些则不需要