gpt4 book ai didi

c# - 如何对自己进行 Linq GroupJoin 以填充子/父属性?

转载 作者:行者123 更新时间:2023-11-30 14:37:58 24 4
gpt4 key购买 nike

我有以下类(class)

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

现在我想链接这些类,以便我的基本数组仍然包含所有项目,但每个项目都有其导航属性集(子项、父项)。

是否有提供此功能的任何 Linq 函数?

我最初的想法是先执行 GroupJoin 来填充子项,然后执行 Join 来填充父项。我在下面有我的示例 GroupJoin 代码。我不知道如何让 groupjoin 返回父对象。它试图返回 IEnumerable < IEnumerable < OrderItem >>

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 中分配子数组是否是一个很好的做法,但要完成您想要的,您只需将代码更改为:

  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 以填充子/父属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8606058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com