Automapper说缺少从System.String到System.Char的映射?但我看不到Char的财产

时间:2016-10-12 19:13:10

标签: c# automapper

我有三节课:

public class UserReport : Entity
{
    public string Name { get; set; }
    public string Email { get; set; }
    public List<string> Departments { get; set; }
    public List<string> Titles { get; set; }
}

public abstract class Entity
{
    public Guid Id { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateLastModified { get; set; }
    public string CreatedBy { get; set; }
    public string LastModifiedBy { get; set; }
    public bool Active { get; set; }

    protected Entity()
    {
        DateCreated = DateTime.Now;
        DateLastModified = DateTime.Now;
        Id = Guid.NewGuid();
    }
}

public class UserModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Departments { get; set; }
    public string Titles { get; set; }
}

将我的automapper配置设置为:

CreateMap<List<string>, string>().ConvertUsing(strings => {
            if (strings != null)
                return string.Join("\n", strings);
            return "";
        });
CreateMap<UserReport, UserModel>();

尝试使用Automapper Ef Extensions从通用方法调用时:

IQueryable<TModel> modelQueryable = _reportService.GetReportBaseQuery().ProjectToQueryable<TModel>();

我收到此错误

  

缺少从System.String到System.Char的映射。使用Mapper.CreateMap创建。

GetReportBaseQuery()返回IQueryable<TReport>,因此此实例中为UserReport。我没有看到任何char属性,为什么会出现这种情况?

只是为了测试我试图制作一个:

CreateMap<String, Char>().ConvertUsing(x => x.FirstOrDefault());

然后它说:

  

参数类型不匹配

进一步的研究表明,这有效:

Mapper.Map<List<TReport>, List<TModel>>(_reportService.GetReportBaseQuery().ToList());

但我不能使用它,因为我需要它是一个可查询返回。因此,当我尝试进行EF投影时,情况有所不同,但不确定那是什么。将select语句从一个语句写入另一个语句很容易,但这不是通用的并且可以重复使用。

1 个答案:

答案 0 :(得分:0)

解决方案是明确设置DepartmentsTitles字段的映射:

CreateMap<UserReport, UserModel>()
    .ForMember(x => x.Departments, o => o.MapFrom(s => string.Join("\n", s.Departments)))
    .ForMember(x => x.Titles, o => o.MapFrom(s => string.Join("\n", s.Titles)));

但是,这并不能解释为什么会出现这种情况。 正如DOTang指出的那样:

  

LINQ to Entities无法识别方法&#39; System.String Join(System.String,System.Collections.Generic.IEnumerable1 [System.String])&#39;方法,并且此方法无法转换为商店表达式。

AutoMapper扩展程序似乎试图映射以下内容:

IEnumerable<string> => IEnumerable<char>