AutoMapper ProjectTo:无法处理嵌套对象

4

我有以下数据传输对象:

public class SingleForm
{
    // other props left out for brevity

    public List<Filter> Filters { get; set; }
}

我随后尝试使用AutoMapper进行映射,如下所示:
CreateMap<Form, SingleForm>()
    .ForMember(dest => dest.Filters, 
        opts => opts.MapFrom(src => 
            Mapper.Map<List<Filter>>(src.Questions)));

CreateMap<FormQuestion, Filter>()
    .ForMember(dest => dest.Header, 
        opts => opts.MapFrom(src => src.Question.QuestionText));

我随后使用 ProjectTo:
var query = this.context.Forms
    .Where(e => e.Id == message.FormId)
    .ProjectTo<SingleForm>()
    .FirstOrDefault();

然而,当我执行查询时,我的过滤器集合是空的。

当我尝试使用LINQ手动映射集合时,如下所示,它可以正常工作,所以我想知道是否有做错什么?

var query = this.context.Forms
    .Where(e => e.Id == message.FormId)
    .Select(e => new SingleForm
    {
        Id = e.Id,
        Filters = e.Questions.Select(q =>
            new Filter { 
                Header = q.Question.QuestionText 
        }).ToList()
    })
    .FirstOrDefault();
2个回答

3

总的来说,在配置文件中最好避免调用Mapper.Map()。因此,我认为将你的第一个映射更改为以下内容可能会有所帮助:

CreateMap<Form, SingleForm>()
    .ForMember(dest => dest.Filters,
        opts => opts.MapFrom(src => src.Questions));

0
如果映射发生在DbContext之外,则应使用includes方法检索所有关系项,这些项无法在没有DbContext的情况下进行延迟加载。

这就是 ProjectTo() 的关键所在 - 参见 Automapper Queryable Extensions - SpruceMoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接