迭代包含自引用列表的列表

时间:2013-07-26 14:01:36

标签: c# linq entity-framework collections

假设我有以下数据库模型: Database model

在代码中,这看起来像这样:

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 。我想对列表中的所有按钮执行相同的操作。 这样做的问题是我不知道,也不能说,有多少子级别。可能只有一个子类别,但它也是子类别的子类别的子类别,......等等。

Example

如何轻松将所有 ButtonCategory 项目和按钮项目转换为其他类型?

提前致谢!

1 个答案:

答案 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

请参阅: