Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用参数映射条件下的链接成员_C#_Asp.net Core_Automapper_Entity Framework Core 3.0 - Fatal编程技术网

C# 使用参数映射条件下的链接成员

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

我有以下型号和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; }
    }
//模型
公共类用户
{
//钥匙
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();