0

可以说我有以下数据库模型: 数据库模型

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

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项和Button项转换为另一种类型?

提前致谢!

4

1 回答 1

4

我不确定“容易”,但您可以实现自己的递归扩展方法来做到这一点:

但是,我相信 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 和递归函数

看:

于 2013-07-26T14:47:40.987 回答