自我引用从父项到最后一个孩子的列表项目计数

问题描述 投票:0回答:2

我有一个自引用类别列表,其中每个类别都有子项列表,同时有一个项目列表。示例category1(有3个项目,有1个子子类别)子类别(有1个项目,有父类别1,没有孩子)当我获取包含项目计数的类别列表时,所以我期望得到category1(itemcount = 4)但我得到的是3

public class Category {
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public virtual Category Parent { get; set; }
    public virtual ICollection<Category> Children { get; set; }
    public ICollection<Item> Items { get; set; }
}

以下是dto

public class CategoryForReturnDto
{
     public string Name { get; set; }
     public int Id { get; set; }
     public int ItemsCount { get; set; }
     public ICollection<Category> Children { get; set; }
     public int ParentId { get; set; }
}

最后是自动播放器

        CreateMap<Category, CategoryForReturnDto> ()
            .ForMember (dest => dest.ItemsCount, opt => {
                opt.MapFrom (src => src.Items.Count);
            });

项目模型是

public class Item {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<ItemPhoto> Photos { get; set; }
    public Category Category { get; set; }
    public int CategoryId { get; set; }
}

数据库示例:

enter image description here

enter image description here

c# automapper asp.net-core-2.1
2个回答
0
投票

你说自己

示例category1(有3个项目,有1个子子类别)

所以ItemCount正确返回3.这正是你告诉它返回的:

opt.MapFrom (src => src.Items.Count);

我没有在DTO中看到SubCategories的任何收藏或财产;直到你把它们包括在内,你才能得到你想要的数字。 (我不确定你想要的号码是什么; ItemCount是误导性的。)


0
投票

解决方案是添加一个功能

    static int RecursiveItemsCount (Category cat, int count) {
        count += cat.Items.Count ();
        foreach (var child in cat.Children) {
            count += RecursiveItemsCount (child, 0);
        }
        return count;
    }

并在自动化器内部

        CreateMap<Category, CategoryForReturnDto> ()
            .ForMember (dest => dest.ItemsCount, opt => {
                int number = 0;
                opt.ResolveUsing (src => {
                    return RecursiveItemsCount (src, number);
                });
            });
© www.soinside.com 2019 - 2024. All rights reserved.