我有以下课程
public class OrderItem
{
public Guid ID { get; set; }
public Guid? ParentID { get; set; }
public IEnumerable<OrderItem> Children { get; set; }
public OrderItem Parent { get; set; }
}
我最初将它们全部从数据库中提取并放入数组中。
OrderItem[] arrOrderItems = ctx.Database.SqlQuery<OrderItem>(orderItemsQuery).ToArray();
现在,我想链接这些类,以便我的基本数组仍包含所有项目,但是每个项目都有其导航属性集(Children,Parent)。
是否有任何提供此功能的Linq函数?
我最初的想法是先进行GroupJoin填充孩子,然后再进行Join填充父母。我下面有示例GroupJoin代码。我不知道如何让groupjoin返回父对象。它试图返回IEnumerable >
arrOrderItems = arrOrderItems.GroupJoin(arrOrderItems,
x => x.ID, x => x.ParentID,
(parent, children) =>
parent.Children = children);
有什么想法吗?
编辑:
我只想找到一种更好(更快)的方法
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内分配children数组是一种很好的做法,但是要实现所需的功能,只需将代码更改为:
var result = arrOrderItems.GroupJoin( arrOrderItems,
x => x.ID, x => x.ParentID,
( parent, children ) => { parent.Children = children; return parent; } );
如果要重新分配arrOrderItems,还必须添加一个.ToArray(),例如
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;
}
关于c# - Linq GroupJoin如何通过自我加入来填补 child / parent 的属性(property)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8606058/