从父项到最后一个子项的自引用列表项计数
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);
});
});
我有一个自引用的类别列表,其中每个类别都有子项列表,同时有一个项目列表。 示例类别 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);
});
});