自动调制员说系统中缺少地图.字符串到System.Char?但是我没有看到Char属性

本文关键字:Char System 属性 字符串 调制 系统 地图 | 更新日期: 2023-09-27 18:12:59

我有三个类:

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; }
}

我的自动调速器配置设置为:

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.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语句很容易,但这不是通用的和可重用的。

自动调制员说系统中缺少地图.字符串到System.Char?但是我没有看到Char属性

解决方案是显式地为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不能识别方法System。字符串连接(系统。String, System.Collections.Generic.IEnumerable1[System.String])'方法,并且此方法不能转换为存储表达式。

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

IEnumerable<string> => IEnumerable<char>