在Entity Framework 6中投射自我引用的多层实体。
假设我有一个 Category
实体,如下所示:
public class Category
{
public int CategoryId { get; set; }
public int? ParentCategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> SubCategories { get; set; }
public virtual ICollection<Product> Products { get; set; }
public Category()
{
SubCategories = new HashSet<Category>();
Products = new HashSet<Product>();
}
}
我希望能够将整个Category
DbSet
的层级结构映射到下面的 POCO 类中(包括所有可能的子类别和父类别):
public class CategoryView
{
public int Id { get; set; }
public int? ParentCategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public CategoryView ParentCategory { get; set; }
public List<CategoryView> SubCategories { get; set; }
public int ProductCount { get; set; }
public Category()
{
SubCategories = new HashSet<CategoryView>();
}
}
请记住,一个类别可能有无限级的子类别,具体如下所示:
Category (Level 0)
SubCategory1 (Level 1)
SubCategory2
SubCategory2SubCategory1 (Level 2)
SubCategory2SubCategory2
SubCategory2SubCategory2SubCategory1 (Level 3)
... (Level N)
SubCategory3
试图创建一个递归方法来处理每个类别的子类别和父级类别以创建层级时,出现了"stackoverflow exception"错误。由于"ParentCategory"与"SubCategories"之间的关系,在第一个类别("Category")和第一个子类别("SubCategory1")之间卡住了。
有什么最好、最优雅的方法可以完成这样的投影(而不是消除父级)吗?还是有其他方法吗?
任何帮助都将不胜感激。
谢谢,
IQueryable<CategoryView>
还是IEnumerable<CategoryView>
?此外,CategoryView
的ParentCategory
和SubCategories
不应该指向帖子中的Category
对象,而应该指向CategoryView
对象。 - Ivan Stoev