C# 如何在self上进行Linq GroupJoin以填充子/父属性?

C# 如何在self上进行Linq GroupJoin以填充子/父属性?,c#,linq,join,C#,Linq,Join,我有以下课程 public class OrderItem { public Guid ID { get; set; } public Guid? ParentID { get; set; } public IEnumerable<OrderItem> Children { get; set; } public OrderItem Parent { get; set; } } 有什么想法吗 编辑: 我只是想找到一个更好(更快)的方法来做到这一点 fo

我有以下课程

public class OrderItem
{
    public Guid ID { get; set; }
    public Guid? ParentID { get; set; }
    public IEnumerable<OrderItem> Children { get; set; }
    public OrderItem Parent { get; set; }
}
有什么想法吗

编辑:

我只是想找到一个更好(更快)的方法来做到这一点

foreach(OrderItem item in arrOrderItems)
{
    if (item.ParentID.HasValue)
        item.ParentOrderItem = arrOrderItems.Where(x => x.ID == item.ParentID.Value).FirstOrDefault();

    item.Children = arrOrderItems.Where(x => x.ParentID.HasValue && x.ParentID.Value == item.ID).ToArray();
}

不确定在GroupJoin中分配子数组是否是一种很好的做法,但要实现您的目标,只需将代码更改为:

  var result = arrOrderItems.GroupJoin( arrOrderItems,
                                        x => x.ID, x => x.ParentID,
                                        ( parent, children ) => { parent.Children = children; return parent; } );
如果要重新分配arroderitems,还必须添加一个.ToArray(),如

我认为一个更好的做法是将实际执行任务的代码分离出来,就像这样

foreach ( var pair in arrOrderItems.GroupJoin( arrOrderItems,
                                               x => x.ID, x => x.ParentID,
                                               ( parent, children ) => Tuple.Create( parent, children ) ) ) {

  var parent = pair.Item1;
  var children = pair.Item2;

  parent.Children = children;
  foreach ( var child in children )
    child.Parent = parent;
  }

您使用的是实体框架还是LINQ to SQL?不,使用自定义SQL查询并告诉.sqlquery要用数据填充哪个对象。从我在问题(9:20)中发布的循环到您在72000项数组中发布的循环(0:20),执行时间提高了+1。
  var result = arrOrderItems.GroupJoin( arrOrderItems,
                                        x => x.ID, x => x.ParentID,
                                        ( parent, children ) => { parent.Children = children; return parent; } );
  arrOrderItems = arrOrderItems.GroupJoin( arrOrderItems,
                                           x => x.ID, x => x.ParentID,
                                           ( parent, children ) => { parent.Children = children; return parent; } ).ToArray();
foreach ( var pair in arrOrderItems.GroupJoin( arrOrderItems,
                                               x => x.ID, x => x.ParentID,
                                               ( parent, children ) => Tuple.Create( parent, children ) ) ) {

  var parent = pair.Item1;
  var children = pair.Item2;

  parent.Children = children;
  foreach ( var child in children )
    child.Parent = parent;
  }