2009-12-10 71 views
1

我,實際上是樹對象結構(定義我的實體內唯一的相關性)的實體:如何將對象轉換嵌套對象

public class TreeItem 
{ 

    public int Id { get; set; } 

    public TreeItem Parent { get; set; } 

    public List<TreeItem> Children { get; set; } 

    ... 

} 

家長和兒童屬性是否正確定義的導航性能。所以,當我打電話是這樣的:

var items = (from ti in context.TreeItem() 
      select ti).ToList<TreeItem>(); 

其實我得到一個樹形結構我的項目,因爲EF工作它的魔力幕後,並填充我的父母和孩子在這些項目上。

我現在想要做的是將這些對象轉換爲非常多POCO的ViewModel對象。沒有功能,只有數據。

我可以通過創建和填充新對象的遞歸方法來進行轉換,但是有一種更簡單的方法(以LoC方式 - 代碼行)來實現這種轉換嗎?

+0

我覺得你可以構造一個對象(定製一個):

更新,給你什麼,我的意思是一個想法:

public static class Extensions { public static IList<R> TransformTree<T, R>(this IEnumerable<T> collection, Func<T, IEnumerable<T>> entitySelector, Func<R, IList<R>> pocoSelector, Func<T, R> transformer) { var transformedList = new List<R>(); var stack = new Stack<IEnumerable<T>>(); var parents = new Dictionary<IEnumerable<T>, R>(); stack.Push(collection); while (stack.Count > 0) { IEnumerable<T> items = stack.Pop(); R transformedParent; IList<R> parentChildren = parents.TryGetValue(items, out transformedParent) ? pocoSelector(transformedParent) : transformedList; foreach (var item in items) { R transformedItem = transformer(item); parentChildren.Add(transformedItem); IEnumerable<T> children = entitySelector(item); stack.Push(children); parents.Add(children, transformedItem); } } return transformedList; } } 

調用它像這樣linq和lambda表達式。謝謝 – 2009-12-10 11:15:26

+0

沒問題,只是想幫忙。 – 2009-12-10 11:42:22

回答

1

this相關問題的幾種方法進行了討論:

  • 遞歸之一,可能會是最容易實現的,但是在推廣的深度和項目數量而言,這是因爲它往往限制成倍需要更長的時間和風險溢出你的籌碼
  • 另一種方法是使用一個棧,在比例方面有一個更爲線性增長

一定要檢查出埃裏克利珀的COM在頁面的底部。而這樣做的查詢使用

treeItems.TransformTree<TreeItem, TreeItemPoco>(
    (item) => { return item.Children; }, 
    (pocoItem) => { return pocoItem.Children; }, 
    (item) => { return new TreeItemPoco(item); }); 
+0

堆棧方式似乎比遞歸快得多,但它仍然需要大量的行。我正在尋找一系列擴展方法調用和/或lambda表達式的簡單技巧......但如果沒有其他任何東西出現,我會使用堆棧。 – 2009-12-10 11:24:15

+0

但仔細看它,堆棧方法將樹結構變爲IEnumerable 。我想將一個樹結構轉換爲一個不同的類型樹結構,所以這對我沒有什麼幫助。 – 2009-12-11 09:59:34

+0

我知道;請記住,你只想走樹,並用它做點什麼。將它弄平,或用POCO重建一個樹形結構。兩種方法都應該仍然有效。 – 2009-12-11 10:52:12