如何将值传递给 AutoMapper Profile 投影?

Ben*_*Ben 5 automapper entity-framework-core

我们可以查看支持票证列表。

如果当前登录的用户已回复支持票证,我们现在需要显示附加图标。这意味着我们必须向投影添加额外的属性,我们不能只过滤当前用户的列表。

现在我们的想法是将这个附加属性与配置文件映射。但我们不知道如何将当前用户 ID 传递到配置文件。

在它可能看起来像这样

public class SupportTicketProjectionProfile : AutoMapper.Profile
{
    public SupportTicketProjectionProfile()
    {
        CreateMap<SupportTicketEntity, SupportTicketProjection>()
            .ForMember(p => p.CurrentUserHasReplied, 
               opt => opt.MapFrom(e=>e.Editors.Any(editor=> editor.Id == **passedIdValue**))
Run Code Online (Sandbox Code Playgroud)

但是如何传递userId呢?

我们发现我们可以将 Dictionary<string, object> 传递给 ProjectTo 方法。机器人我们找不到任何文档如何在 AutoMapper 配置文件中访问此字典。

感谢您的任何提示。

Ben*_*Ben 6

我终于找到了窍门:创建一个临时映射模型。

public class SupportTicketUserContextExpressionModel
{
    public SupportTicketEntity SupportTicket { get; set; }
    public bool UserHasReplied { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

借助(让我们命名为)表达式模型,您可以注入其他子查询结果:

var query = _dbContext.SupportTickets
    .Select(ticket => new
    {
        ticket,
        hasReplied = ticket.Editors.Any(e => e.UserId == userId)
    })
    .Select(temp => new SupportTicketUserContextExpressionModel
    {
        SupportTicket = temp.ticket,
        HasReplied = temp.hasReplied
    }));
Run Code Online (Sandbox Code Playgroud)

现在您需要一个新的附加配置文件:

CreateMap<SupportTicketUserContextExpressionModel, SupportTicketUserView>()
     .ForMember(p => p.TicketId,
         opt => opt.MapFrom(e => e.SupportTicket.Id))

     // more here

     .ForMember(p => p.UserHasReplied,
         opt => opt.MapFrom(e => e.HasReplied));
Run Code Online (Sandbox Code Playgroud)

您可以使用您的 ProjectTo 的配置文件:

.ProjectTo<SupportTicketUserView>(_mapper.ConfigurationProvider);
Run Code Online (Sandbox Code Playgroud)

谢谢,本!