2011-12-22 1 views
3

は、私が最初にデータベースから、配列にそれらすべてをフェッチLinq GroupJoinを子/親プロパティを満たすために自己で行うにはどうすればいいですか?

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コードを持っています。私はどのようにグループの親オブジェクトを返すグループを持っているか把握することができませんでした。任意の考えIEnumerableを< IEnumerableを<のOrderItem>>

arrOrderItems = arrOrderItems.GroupJoin(arrOrderItems, 
             x => x.ID, x => x.ParentID, 
             (parent, children) => 
             parent.Children = children); 

を返すようにしようとしていますか?

編集:私はちょうどGroupJoin内部の子配列を割り当てることは非常に良い練習があることを、この

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

のような割り当てを行うコードのビットを分離することだと思うあなたは、SQLにEntity Frameworkのか、LINQを使用していますか? –

+0

いいえ、カスタムSQLクエリを持って、単にデータを入力するオブジェクトを.sqlqueryに伝えます。 –

答えて

6

わからない行うが、何を達成するために、より良い(速い)方法を見つけたい

のように)あなたがarrOrderItemsを再割り当てする場合は、.ToArrayを(追加することもあるんだけど

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

+1私の質問(9:20)からあなたのもの(0:20)に72,000項目の配列で投稿したループからの非常識な実行時間の改善。 –

関連する問題