自动调制员说系统中缺少地图.字符串到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语句很容易,但这不是通用的和可重用的。
解决方案是显式地为Departments
和Titles
字段设置映射:
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>