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();