问题描述
我有以下型号和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();