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

Self Referencing list item count from parent to to last child

我有一个自引用的类别列表,其中每个类别都有子项列表,同时有一个项目列表。 示例类别 1(有 3 个项目,有 1 个子类别) 子类别(有 1 个项目,有父类别 1,没有子类别) 当我获取类别列表时,我包括了项目计数,所以我希望获得类别 1 ( 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; }
}

数据库示例:

你说你自己

example category1 (has 3 items, has 1 children subcategory )

所以 ItemCount 正确 returns 3。这正是你要告诉它的 return:

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

我在子类别的 DTO 中没有看到任何集合或 属性;在将它们包括在内之前,您无法获得所需的号码。 (我不确定你会怎么称呼你想要的数字;ItemCount 具有误导性。)

解决方案是添加一个函数

    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);
                });
            });