如何将int映射到布尔值

时间:2017-04-20 12:59:10

标签: automapper

我正在使用AutoMapper 5.2。我目前有一个映射语句,如下所示:

 CreateMap<JeffreysOnline.Data.Customer, JeffreysOnline.Entities.Customer>()
                .ForMember(s => s.CustomerWant, t => t.Ignore());

Customer表和Customer实体都有一个名为BadChecks的字段。在数据库中它是一个int。我最近在我的实体中将类型更改为bool。 AutoMapper现在给我以下错误:

Unable to create a map expression from Customer.BadChecks (System.Int16) to Customer.BadChecks (System.Boolean) Mapping types: Customer -> Customer JeffreysOnline.Data.Customer -> JeffreysOnline.Entities.Customer Type Map configuration: Customer -> Customer JeffreysOnline.Data.Customer -> JeffreysOnline.Entities.Customer Property: BadChecks

似乎AutoMapper不知道如何从int映射到布尔值。我可以用这个来帮助AutoMapper吗?

知道在我的DAL中,我正在使用ProjectTo()将IQueryable传递给另一个试图访问数据的方法,因此正在发生映射(生成错误),这可能会有所帮助。我的DAL代码如下所示:

return entityList.OrderBy(row => row.LastName).ProjectTo<Entities.Customer>();

2 个答案:

答案 0 :(得分:5)

Automapper 6.0.2 - 无需任何ForMember工作... null,0 = false,值&gt; = 1映射为true。

在Automapper 6.0.2中 - 其他方式:

    class nnnProfile : Profile
    {
        CreateMap<src, dst>()
            .ForMember(d => d.Decision, opt => opt.ResolveUsing<CustomBoolResolver>());    
    }

解析器:

public class CustomBoolResolver : IValueResolver<src, dst, bool>
{
    public bool Resolve(src source, dst destination, bool destMember,
        ResolutionContext context)
    {
        return source.Decision == 1;
    }
}

但这是每个目的地,所以不太灵活。

根据此页面: http://taswar.zeytinsoft.com/automapper-mapping-objects-part-5-of-7-customresolver/

过去你可以编写一个只包含Source和target类型的自定义解析器。

答案 1 :(得分:2)

我不认为会知道如何从int映射到布尔值。

如果你弄清楚应该怎么做,你需要创建一个从int到boolean的映射。:

CreateMap<int, bool>().ProjectUsing(src => src != 0);

完全猜测那里。但是,由于您正在使用ProjectTo,因此您需要使用ProjectUsing,以便表达式可以直接进入DAL。

请记住,使用ProjectUsing时,AutoMapper实际上并没有执行映射。它正在创建一个LINQ&#34; Select&#34;它传递给你的查询提供者的表达式(EF可能?)。因此,您需要确保在投影表达式中使用的任何内容,EF都可以支持将其最终转换为SQL。