2011-12-22 50 views
3

我有以下類如何做Linq Group加入自我填充兒童/父母的屬性?

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代碼。我無法弄清楚如何讓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(); 
} 
+0

您正在使用實體框架或LINQ to SQL的位? – 2011-12-22 15:35:03

+0

不,有一個自定義的SQL查詢,只是告訴.sqlquery什麼對象來填充數據。 – 2011-12-22 15:44:22

回答

6

不能確定分配羣組加入裏面的孩子陣列是一個很好的做法,但要完成什麼你想你只是將代碼更改爲:

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; 
    } 
+1

+1從我的問題(9:20)發佈到你的(0:20)72,000項目數組的循環中,瘋狂的執行時間得到了改善。 – 2011-12-22 16:06:21