2012-12-19 73 views
12

我在兩個實現存儲庫接口的不同模型中有兩個數據集合。其中之一是在一個平坦的列表中,它非常適合Repository模型。另一個數據模型被格式化爲樹形結構,並且我構建的存儲庫接口的實現看起來很陰暗。我可以嘗試將第二個數據模型扁平化並僅使用對父項的引用,但目前該應用程序能夠將數據作爲樹結構獲得一些很大的好處。在樹結構中使用數據模型實現存儲庫模式

我想知道是否某人有任何使用樹結構數據模型實現存儲庫模式的經驗。目前在我的Get(Func<T, bool> predicate)方法中,我使用遞歸方法展開列表,並用LINQ查詢返回對象,但我覺得這個實現有點費錢。

有關如何實現這一點的任何提示,將不勝感激。

下面是通過謂詞方法獲得的實現,如果這有助於說明實現的sillines。

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    var objects = GetAll<T>(); 
    return objects.Where(predicate); 
} 

編輯: 更多的代碼

private IEnumerable<TreeData> GetRecursiveObjects(TreeData object) 
    { 
     var allChildren = new List<TreeData>(); 
     allChildren.AddRange(object.Children); 

     foreach (var child in object.Children) 
     { 
      allChildren.AddRange(GetRecursiveObjects(child).ToArray()); 
     } 
     return allChildren; 
    } 

    protected virtual IEnumerable<T> GetAll<T>() 
    { 
     var objects = new List<T>(); 
     objects.AddRange(Objects); 
     foreach (var object in Objects) 
     { 
      objects.AddRange(GetRecursiveObjects(object)); 
     } 
     return objects.OfType<T>(); 
    } 

第二個編輯:

我也有點困惑什麼將元素添加到庫中一個很好的策略會。我應該在使用代碼中處理添加到父元素的子元素還是應該將元素和參考引用到它的父元素並處理整個添加操作?

TL;博士

是不是瘋了,試圖實現在一個樹形結構數據的存儲庫接口?

+1

您的問題的答案真的取決於您的樹的結構以及您如何實際查找數據。你能否提供更多的細節? – James

+0

GetAll方法遞歸地通過小孩並將它們添加到列表中。 – Moriya

+0

只是爲了我的好奇心:爲什麼你堅持平坦的結構?爲什麼存儲庫不能/不應該返回一個樹狀結構? –

回答

4

您可以編寫一個方法來遍歷樹並使用迭代器塊(yield return)返回IEnumerable<T>

那麼你就不必創建你的樹內容的「扁平」的收集和你可以只使用LINQ到對象以應用斷言:

protected virtual IEnumerable<T> Get(Func<T, bool> predicate) 
{ 
    return WalkAll().Where(predicate); 
} 

事實上,在LINQ查詢止跌直到客戶端代碼枚舉它纔會被評估。