从父母到最后一个孩子的自参照列表项计数

时间:2019-02-16 12:21:47

标签: c# automapper asp.net-core-2.1

i有一个类别的自引用列表,其中每个类别都有一个孩子列表,同时还有一个项目列表。 示例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

2 个答案:

答案 0 :(得分:0)

你说自己

  

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

因此ItemCount正确返回3。这就是您要告诉它返回的内容:

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

我在DTO中看不到SubCategories的任何集合或属性;直到您将它们包括在内,您才能获得所需的号码。 (我不确定您会叫什么电话号码; ItemCount有误导性。)

答案 1 :(得分: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);
                });
            });
相关问题