AutoMapper将字符串集合映射到另一个集合中某个集合的属性



如何使用LINQ和AutoMapper将IdContributors(字符串集合(映射到集合TAction内的集合(Contributors(,属性(ContributorId(为字符串?

public ViewModelToDomainMappingProfile()
{
CreateMap<ActionViewModel, TAction>();
//.ForMember(d => d.Contributors, opt => opt.MapFrom(a => ids = a.IdContributors.Select(x => { })));
}

型号

型号TAction

public class TAction
{
public Guid Id {get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<TActionContributor> Contributors { get; set; }
}
public class TActionContributor
{
public Guid TActionId { get; set; }

[ForeignKey("TActionId")] 
public TAction Action { get; set; }

public string ContributorId { get; set; }

[ForeignKey("ContributorId")] 
public ApplicationUser Contributor { get; set; }
}

ActionViewModel

public class ActionViewModel
{
public Guid Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<string> IdContributors { get; set; }
}

我可以在这里看到两个选择,您将选择更适合您需求的解决方案:


1(从MapFrom((中选择((

CreateMap<ActionViewModel, TAction>()
.ForMember(
destination => destination.Contributors,
options => options.MapFrom((source, destination) =>
{
var contributors = source
.IdContributors
.Select(id => new TActionContributor
{
Action = destination,
Contributor = new ApplicationUser
{
Id = id,
},
ContributorId = id,
TActionId = source.Id,
})
.ToList();
contributors.ForEach(ac => ac.Contributor.Contributors = contributors);
return contributors;
}));

2(自定义值解析程序

这与第一个解决方案相同,如果您想保持映射概要文件的整洁,并在可能的情况下删除自定义逻辑,则可能更具可读性。

public class TActionContributorValueResolver : IValueResolver<ActionViewModel, TAction, ICollection<TActionContributor>>
{
public ICollection<TActionContributor> Resolve(
ActionViewModel source,
TAction destination,
ICollection<TActionContributor> destMember,
ResolutionContext context)
{
var contributors = source
.IdContributors
.Select(id => new TActionContributor
{
Action = destination,
Contributor = new ApplicationUser
{
Id = id,
},
ContributorId = id,
TActionId = source.Id,
})
.ToList();
contributors.ForEach(ac => ac.Contributor.Contributors = contributors);
return contributors;
}
}

配置:

CreateMap<ActionViewModel, TAction>()
.ForMember(
destination => destination.Contributors,
options => options.MapFrom<TActionContributorValueResolver>());

最后注释:

contributors.ForEach(ac => ac.Contributor.Contributors = contributors);

上面的行允许您从TActionTActionContributorApplicationUser以及其他方式无休止地遍历。如果您不需要该功能,请删除它,并立即返回contributors列表。

最新更新