Automapper ResolveUsing导致“无法将此解析为可查询表达式”

我正在使用autommaper将域类映射到模型类,反之亦然。 我需要加密/解密一个属性。 当我将模型映射到域时没有问题,完美地工作:

Mapper.CreateMap().ForMember(dest => dest.Password, opt => opt.ResolveUsing(src => this.EncryptString(src.Password))) 

但是当将实体映射到模型的automapper崩溃并抛出“无法将其解析为可查询表达式”时:

 Mapper.CreateMap().ForMember(dest => dest.Password, opt => opt.ResolveUsing(src => this.DecryptString(src.Password))) 

我也尝试过自定义值解析器,结果相同:

 Mapper.CreateMap().ForMember(dest => dest.Password, op => op.ResolveUsing().FromMember(x => x.Password)); public class PasswordResolver : ValueResolver { protected override string ResolveCore(object source) { return "TEST"; } } 

如文档所述,您不能在可查询表达式中使用自定义解析器:

https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions#supported-mapping-options

但是,您可以使用MapFrom:

 Mapper.CreateMap() .ForMember(dest => dest.Password, op => op.MapFrom(src => "TEST")); 

我猜这不是你想要为密码属性做什么,但这就是你如何修复这个例子。

我认为你的问题是你试图在查询中调用.NET代码到错误的数据库。

您可以做的是使用投影而不是使用.ProjectTo使用.UseAsDataSource(配置).AfterProjection和.BeforeProjection。 这两个都允许您将值投影到正确的字段中,然后对结果进行操作以加密/解密,以便获得您正在寻找的实际值。

一旦你通过那2,然后你调用.For();

否则,您总是在实际的SQL查询上运行,这显然无法执行.NET代码。