在带参数的条件下映射链接的成员

问题描述

我有以下型号和dto:

CASE WHEN n.level = 1 THEN n.sid ELSE MAX(CASE WHEN p.level = 1 THEN p.sid END) END res l1_ancestor

在我的控制器中,只有在以下情况下,我才希望在Automapper的帮助下将 User + ElementMember 信息投影到 ElementDetailsDto 对象中: ElementMember 表的 UserId 等于控制器提供的键+ IsActiveMember == true。如果不是,则DTO中的该对象可以保持为空。

//Model
    public class User
    {
        //Key
        public int UserId { get; set; }
        public string UserName { get; set; }

        public List<ElementMember> ElementMembers { get; set; }

    }
    public class ElementMember
    {
        //Foreign Key
        public int UserId { get; set; }
        //Foreign Key
        public int ElementId { get; set; }

        public bool IsActiveMember { get; set; }

        public virtual Element Element { get; set; }
        public virtual User User { get; set; }
    }
    public class Element
    {
        //Key
        public int ElementId { get; set; }
        public string ElementName { get; set; }

        public List<ElementMember> ElementMembers { get; set; }

    }

    //DTO
    public class ElementMemberDto
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
        //Some properties
    }

    public class ElementDetailsDto
    {
        public int ElementId { get; set; }
        public string ElementName { get; set; }
        public ElementMemberDto ElementMember { get; set; }
    }

如果可以避免两次调用数据库,那就太好了。 Automapper的高级功能我有些迷茫。

此致

解决方法

我不确定是否可以在一个查询中完成。但是您可以使它像下面这样工作:

var mapElementDetails = new MapperConfiguration(cfg =>
    cfg.CreateMap<Element,ElementDetailsDto>());

var mapElementMember = new MapperConfiguration(cfg =>
    cfg.CreateMap<ElementMember,ElementMemberDto>()
    .ForMember(dto => dto.UserName,conf => conf.MapFrom(ol => ol.User.UserName)));

ElementDetailsDto elementDetailsDto = _db.Elements.ProjectTo<ElementDetailsDto>(mapElementDetails).FirstOrDefault(e => e.ElementId == elementId);


elementDetailsDto.ElementMember = _db.ElementMember
    .Where(e => e.UserId == userId && e.ElementId == elementId && e.IsActiveMember == true)
    .ProjectTo<ElementMemberDto>(mapElementMember).FirstOrDefault();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...