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

时间:2015-05-12 07:57:52

标签: c# .net asp.net-mvc automapper

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

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

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

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

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

Mapper.CreateMap<Entity, EntityModel>().ForMember(dest => dest.Password, op => op.ResolveUsing<PasswordResolver>().FromMember(x => x.Password));


public class PasswordResolver : ValueResolver<object, string>
{
        protected override string ResolveCore(object source)
    {
        return "TEST";
    }

}

2 个答案:

答案 0 :(得分:17)

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

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

但是,您可以使用MapFrom:

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

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

答案 1 :(得分:0)

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

您可以做的是在任何使用投影而不是.Project的地方使用.UseAsDataSource(Configuration).AfterProjection和.BeforeProjection。这两种方法都可以使您将值投影到正确的字段中,然后对结果进行操作以进行加密/解密,从而获得所需的实际值。

一旦通过了那两个,就调用.For();

否则,您将始终对无法明显执行.NET代码的实际SQL查询进行操作。