Asp.net core 在AfterMap方法(AutoMaper)内异步设置视图模型的属性

Asp.net core 在AfterMap方法(AutoMaper)内异步设置视图模型的属性,asp.net-core,async-await,many-to-many,automapper,Asp.net Core,Async Await,Many To Many,Automapper,在我的数据库中,我有标签表和帖子表。它们之间存在着多对多的关系。在标记实体中,我不存储使用标记的次数。此属性(数量)位于标记视图模型内 通过使用AutoMapper我在Tag和TagViewModel之间创建了一个映射。内部AfterMap方法一设置数量属性: Mapper.Initialize(config => { config.CreateMap<Tag, TagViewModel>() .AfterMap(async (m, vm) =>

在我的数据库中,我有标签表和帖子表。它们之间存在着多对多的关系。在标记实体中,我不存储使用标记的次数。此属性(
数量
)位于标记视图模型内

通过使用
AutoMapper
我在
Tag
TagViewModel
之间创建了一个映射。内部
AfterMap
方法一设置
数量
属性:

Mapper.Initialize(config =>
{
    config.CreateMap<Tag, TagViewModel>()
        .AfterMap(async (m, vm) =>
        {
            vm.Quantity = await tagRepository.CountById(vm.Id);
        });
});
如何解决此问题,或者映射后自动设置<代码>数量值的更好解决方案是什么

以下是我的代码的其余部分:

实体:

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<TagPost> TagPost { get; set; } = new HashSet<TagPost>();
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string Content { get; set; }

    public virtual ICollection<TagPost> TagPost { get; set; } = new HashSet<TagPost>();
}

public class TagThread
{
    public int PostId { get; set; }
    public Post Post { get; set; }

    public int TagId { get; set; }
    public Tag Tag { get; set; }
}
存储库:

public async Task<int> CountById(int id)
{
    var quantity = await context.Tags
        .SelectMany(t => t.TagPost.Where(c => c.TagId == id))
        .CountAsync();

    return quantity;
}
public异步任务CountById(int-id)
{
var quantity=await context.Tags
.SelectMany(t=>t.TagPost.Where(c=>c.TagId==id))
.CountAsync();
退货数量;
}

您的标记类上有一个导航属性,为什么不这样做呢:

config.CreateMap<Tag, TagViewModel>()
    .ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count);
config.CreateMap()
.ForMember(d=>d.Quantity,o=>o.MapFrom(s=>s.TagPost.Count);

是的,但这应该与ProjectTo一起使用。ProjectTo与MapFrom一起使用,因为MapFrom接受一个表达式,因此可以将其转换为SQL。如果我使用了ResolveUsing,它将不会是一个表达式。是的,我只是说,这应该是你答案的一部分,因为问题暗示了Map,因为它有那个后映射。我不确定我是否理解还有你。你的问题是关于一个异步AfterMap不起作用。我已经简化了你的代码使其起作用AfterMap内部执行了异步方法,这可能产生了问题-这就是标题正文的原因。在标记存储库中,标记查询现在在哪里?我包含TagPost,你的解决方案正在起作用。谢谢你的帮助。
public async Task<int> CountById(int id)
{
    var quantity = await context.Tags
        .SelectMany(t => t.TagPost.Where(c => c.TagId == id))
        .CountAsync();

    return quantity;
}
config.CreateMap<Tag, TagViewModel>()
    .ForMember(d => d.Quantity, o => o.MapFrom(s => s.TagPost.Count);