我有三节课:
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语句从一个语句写入另一个语句很容易,但这不是通用的并且可以重复使用。
答案 0 :(得分:0)
解决方案是明确设置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无法识别方法&#39; System.String Join(System.String,System.Collections.Generic.IEnumerable1 [System.String])&#39;方法,并且此方法无法转换为商店表达式。
AutoMapper扩展程序似乎试图映射以下内容:
IEnumerable<string> => IEnumerable<char>