假设我有以下数据库模型:
在代码中,这看起来像这样:
ButtonCategories
public class ButtonCategory
{
public ButtonCategory()
{
this.Buttons = new HashSet<Button>();
this.SubCategories = new HashSet<ButtonCategory>();
}
[Key]
public int Id { get; set; }
[Required]
public string Description { get; set; }
public int? ParentCategoryId { get; set; }
[ForeignKey("ParentCategoryId")]
public virtual ButtonCategory ParentCategory { get; set; }
public virtual ICollection<ButtonCategory> SubCategories { get; set; }
public virtual ICollection<Button> Buttons { get; set; }
}
按钮
public class Button
{
[Key]
public int Id { get; set; }
public int? ButtonCategoryId { get; set; }
[ForeignKey("ButtonCategoryId")]
public virtual ButtonCategory ButtonCategory { get; set; }
}
如您所见,我的 ButtonCategories 有一个自引用列表。
发生的问题是,我想将所有 ButtonCategories 转换为其他类型,让我们说 ButtonCategoriesMock 。我想对列表中的所有按钮执行相同的操作。 这样做的问题是我不知道,也不能说,有多少子级别。可能只有一个子类别,但它也是子类别的子类别的子类别,......等等。
如何轻松将所有 ButtonCategory 项目和按钮项目转换为其他类型?
提前致谢!
答案 0 :(得分:3)
我不确定'很容易'但您可以实现自己的递归扩展方法来执行此操作:
但是,我相信Traverse方法,而select可能会处理你的情况
public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> fnRecurse)
{
foreach (T item in source)
{
yield return item;
IEnumerable<T> seqRecurse = fnRecurse(item);
if (seqRecurse != null)
{
foreach (T itemRecurse in Traverse(seqRecurse, fnRecurse))
{
yield return itemRecurse;
}
}
}
}
代码段位于:LINQ and recursive functions
请参阅: