我有一个自引用类别列表,其中每个类别都有子项列表,同时有一个项目列表。示例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; }
}
数据库示例:
你说自己
示例category1(有3个项目,有1个子子类别)
所以ItemCount正确返回3.这正是你告诉它返回的:
opt.MapFrom (src => src.Items.Count);
我没有在DTO中看到SubCategories的任何收藏或财产;直到你把它们包括在内,你才能得到你想要的数字。 (我不确定你想要的号码是什么; 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);
});
});