AutoMapper: Collection to Single string Property

2019-01-20 10:29发布

问题:

I have a scenario in which I have to do following mapping

public class Company : BaseEntity
{            
    public string Name { get; set; }    
    public virtual ICollection<CompanyService> CompanyServices { get; set; }
}
public class Service : BaseEntity
{         
    public string Name { get; set; }
    public virtual ICollection<CompanyService> CompanyServices { get; set; }    
}
public class CompanyService : BaseEntity
{
    public long CompanyID { get; set; }
    public virtual Company Company { get; set; }

    public long ServiceID { get; set; }
    public virtual Service Service { get; set; }    
}

And corresponding View Models

public class CompanyViewModel : BaseEntity
{
    public string Name { get; set; }

    public string Services { get; set; }
}
public class ServiceViewModel : BaseEntity
{
    public string Name { get; set; }
}

public class CompanyServiceViewModel : BaseEntity
{
    public string ServiceName { get; set; }
}

I want to Map using AutoMapper in which I should get Service's Name as comma separated string in CompanyViewModel class

Mapper.CreateMap<Company, CompanyViewModel>();

回答1:

You can use the following mapping:

Mapper.CreateMap<Company, CompanyViewModel>()
    .ForMember(dest => dest.Services,
         m => m.MapFrom(src => string.Join(", ", src.CompanyServices
                                                    .Select (s => s.Service.Name))));

But note that you won't be able to use the mapping in an IQueryable for LINQ to Entities directly, because EF will throw an exception that it can't convert the string.Join part into SQL. You'll have to use AsEnumerable and then do the mapping, like:

Mapper.Map<T>(context.Entities.AsEnumerable(). ...)


标签: AutoMapper