C# 使用参数映射条件下的链接成员
我有以下型号和DTO:C# 使用参数映射条件下的链接成员,c#,asp.net-core,automapper,entity-framework-core-3.0,C#,Asp.net Core,Automapper,Entity Framework Core 3.0,我有以下型号和DTO: //Model public class User { //Key public int UserId { get; set; } public string UserName { get; set; } public List<ElementMember> ElementMembers { get; set; } } public class ElementM
//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; }
}
//模型
公共类用户
{
//钥匙
public int UserId{get;set;}
公共字符串用户名{get;set;}
公共列表元素成员{get;set;}
}
公共类元素成员
{
//外键
public int UserId{get;set;}
//外键
public int ElementId{get;set;}
公共bool IsActiveMember{get;set;}
公共虚拟元素{get;set;}
公共虚拟用户用户{get;set;}
}
公共类元素
{
//钥匙
public int ElementId{get;set;}
公共字符串ElementName{get;set;}
公共列表元素成员{get;set;}
}
//DTO
公共类ElementMemberDto
{
public int UserId{get;set;}
公共字符串用户名{get;set;}
//一些性质
}
公共类elementdetailsdo
{
public int ElementId{get;set;}
公共字符串ElementName{get;set;}
public ElementMemberDto ElementMember{get;set;}
}
在我的控制器中,在Automapper的帮助下,我希望仅当ElementMember表的UserId等于控制器提供的键+IsActiveMember==true时,才将ElementDetailsTo对象中的User+ElementMember信息投影到该对象中。否则,DTO中的此对象可以保持为空
public bool GetElementDetailsController(int elementId)
{
ElementDetailsDto elementDetailsDto = _db.Elements.ProjectTo<ElementDetailsDto>().FirstOrDefault(e => e.ElementId == elementId);
int userId = GetCurrentUserId();
elementDetailsDto.ElementMember = _db.ElementMember.ProjectTo<ElementMemberDto>()
.FirstOrDefault(e => e.UserId == userId && e.ElementId == elementId && e.IsActiveMember == true);
}
public bool getelementdetails控制器(int-elementId)
{
ElementDetailsTo ElementDetailsTo=_db.Elements.ProjectTo().FirstOrDefault(e=>e.ElementId==ElementId);
int userId=GetCurrentUserId();
elementDetailsDto.ElementMember=_db.ElementMember.ProjectTo()
.FirstOrDefault(e=>e.UserId==UserId&&e.ElementId==ElementId&&e.IsActiveMember==true);
}
如果可以避免调用两次数据库,那就太好了。我只是对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();
var-maplementdetails=new-MapperConfiguration(cfg=>
CreateMap());
var maplementmember=新的MapperConfiguration(cfg=>
cfg.CreateMap()
.ForMember(dto=>dto.UserName,conf=>conf.MapFrom(ol=>ol.User.UserName));
ElementDetailsTo ElementDetailsTo=_db.Elements.ProjectTo(mapElementDetails.FirstOrDefault)(e=>e.ElementId==ElementId);
elementDetailsDto.ElementMember=_db.ElementMember
.Where(e=>e.UserId==UserId&&e.ElementId==ElementId&&e.IsActiveMember==true)
.ProjectTo(mapElementMember).FirstOrDefault();