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; }
}
数据库示例:
答案 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);
});
});