Количество элементов списка самоссылки от родителя к последнему потомку - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть собственный список категорий, где у каждой категории есть список детей и в то же время есть список элементов.Пример подкатегории category1 (имеет 3 элемента, имеет 1 дочернюю подкатегорию) (содержит 1 элемент, имеет родительскую category1, не имеет дочерних элементов), когда я получаю список категорий, в которые включено количество элементов, поэтому я ожидаю получить с помощью категории 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; }
}

Пример БД:

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Решением было добавить функцию

    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);
                });
            });
0 голосов
/ 16 февраля 2019

Вы говорите сами

пример категории 1 (имеет 3 элемента, имеет 1 дочернюю подкатегорию)

, поэтому ItemCount вернет 3. Это именно то, что вы говоритедля возврата:

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

Я не вижу коллекций или свойств в DTO для подкатегорий;пока вы не включите их, вы не сможете получить желаемый номер.(Я не уверен, что вы назвали бы номер, который вы хотите; ItemCount вводит в заблуждение.)

...