C# LINQ Select语句使用递归映射实体

C# LINQ Select语句使用递归映射实体,c#,linq,recursion,select,parent-child,C#,Linq,Recursion,Select,Parent Child,我有一个类别实体,它有一个子类别集合和一个对父类别的可空引用 public class Category { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public Category Parent { get; set; } public ICollection<Category> Childr

我有一个
类别
实体,它有一个子类别集合和一个对父类别的可空引用

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }

    public Category Parent { get; set; }
    public ICollection<Category> Children { get; set; } 
}

您可能正在寻找这样的复制构造函数吗

public class Category 
{
    // Copy constructor, recursively called for each child.
    public Category(Category other)
    {
        Id = other.Id;
        Name = other.Name;
        ParentId = other.ParentId;
        Parent = other.Parent;
        // Use this copy constructor for each child too:
        Children = other.Children.Select(c => new Category(c)).ToList();
    }
    // We probably want the default constructor too.
    public Category() { }

    // Your Props...
}
用法:

var deepCopied = zone.Categories.Select(c => new Category(c));

使用如下所示的选择递归方法:

public static class EnumerableExtensions
{
    public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
    {
        foreach (var parent in source)
        {
            yield return parent;

            var children = selector(parent);
            foreach (var child in SelectRecursive(children, selector))
                yield return child;
        }
    }
}

我已经在另一篇文章上读过这个解决方案,但它不符合我需要的要求。我已经提出了一个解决方案。这与我所拥有的相似,因此我将把它作为答案。谢谢
public static class EnumerableExtensions
{
    public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
    {
        foreach (var parent in source)
        {
            yield return parent;

            var children = selector(parent);
            foreach (var child in SelectRecursive(children, selector))
                yield return child;
        }
    }
}
var lookup = _dbContext.Categories.ToLookup(x => x.ParentId);
var parents = lookup[null].SelectRecursive(x => lookup[x.Id]).Where(c => c.ParentId == null).ToList();