gpt4 book ai didi

c# - 在 Entity Framework 6 中投影自引用多级实体

转载 作者:太空狗 更新时间:2023-10-30 01:01:06 25 4
gpt4 key购买 nike

在 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 异常,因为它卡在第一个类别(类别) 和第一个子类别 (SubCategory1) 由于 ParentCategorySubCategories 之间的关系。

进行这种转换(不排除 parent )的最佳且优雅的方式是什么? (或者有没有?)

如有任何帮助,我们将不胜感激。

谢谢,

最佳答案

我不能说这是最好的或优雅的方式,但它是构建此类结构的非常标准且高效的非递归方式。

开始使用简单的投影加载所有类别没有父/子对象链接:

var allCategories = db.Categories
.Select(c => new CategoryView
{
Id = c.CategoryId,
ParentCategoryId = c.ParentCategoryId,
Name = c.Name,
Description = c.Description,
ProductCount = c.Products.Count()
})
.ToList();

然后创建一个快速查找数据结构,用于通过 Id 查找 CategoryView:

var categoryById = allCategories.ToDictionary(c => c.Id);

然后使用先前准备的数据结构将子类别链接到它们的父类别:

foreach (var category in allCategories.Where(c => c.ParentCategoryId != null))
{
category.ParentCategory = categoryById[category.ParentCategoryId.Value];
category.ParentCategory.SubCategories.Add(category);
}

至此,树链接就准备好了。根据您的需要。如果您需要真正的树表示,则返回 allCategories 或根类别:

return allCategories.Where(c => c.ParentCategoryId == null);

附言实际上 allCategories 列表是可以避免的,因为 categoryById.Values 可以达到同样的目的。

关于c# - 在 Entity Framework 6 中投影自引用多级实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41546394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com