2013-05-13 62 views
1

我正在處理測試的軟件,使用Visual Studio 2008,C#3.5進行開發。這些測試保存到SQLite數據庫中,我的軟件用於處理結果。

嗯,有一個信息表收集關於有以下的列測試的一般信息:如何正確使用linq來有效地執行從DataTable到一組遞歸對象的轉換?

  • LayerAName
  • LayerAId
  • LayerBName
  • LayerBId
  • LayerCName
  • LayerCId
  • LayerDName
  • LayerDId
  • Start:一個DateTime,用於指示結果表何時創建。
  • Stop:一個DateTime,用於指示結果表最後一次修改的時間。
  • ResultTableName:此表名稱用於使用虛擬模式在DataGridView中顯示結果。

這些圖層使用它們的ID和btw進行區分,從A層到C層,這些圖層的行爲與用於收集子層的容器類似。只有最後一層「layerD」鏈接到數據庫中的表格。

public abstract class Layer 
{ 
    public String Name { get; set; } 
    public Int32 Id { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime Stop { get; set; } 
} 

public class Project: Layer 
{ 
    private Int32 Id { get; set; } 
    public Dictionary<Int32, LayerB> As { get; set; } 
} 

public class LayerA : Layer 
{ 
    public Project Parent { get; set; } 
    public Dictionary<Int32, LayerB> Bs { get; set; } 
} 

public class LayerB : Layer 
{ 
    public LayerA Parent { get; set; } 
    public Dictionary<Int32, LayerC> Cs { get; set; } 
} 

public class LayerC : Layer 
{ 
    public LayerB Parent { get; set; } 
    public Dictionary<Int32, LayerB> Ds { get; set; } 
} 

public class LayerD : Layer 
{ 
    public LayerC Parent { get; set; } 
    public String ResultTableName { get; set; } 
} 
  • 顯然,如果childLayer.Start < childLayer.Parent.Start => childLayer.Parent.Start = childLayer.Start。
  • 相同種類的邏輯用於Stop屬性,如下所示:if childLayer.Stop> childLayer.Parent.Stop => childLayer.Parent.Stop = childLayer.Stop。

無論如何,事實是,我已經成功地按照以上,但主要是通過在所有的數據行運行一個巨大的循環設計,以創建所有對象給出的信息表如前所述。我也使用LINQ和DataTable作爲Enumerable()的版本,但是我的代碼的兩個版本對我來說都很髒,很難維護。這些困難顯然主要來自從表中轉換/ DataTable的這組層的對象

所以現在我想知道如何改進這個...

  • 有沒有什麼解決方案來改善這種設計?
  • 任何好的模式用於幫助?
  • 是否有任何合適的linqs用於過濾和創建包含具有當前信息表模式的子層的字典。

謝謝。

+0

'LayerB'有一個'詞典<的Int32,LayerB>'財產?這可能嗎? – jarvanJiang 2013-05-13 07:42:42

+0

Typo ... fixed; 0 – Perret 2013-05-13 16:09:18

回答

0

那麼爲什麼不直接

public class ConcreteLayer: Layer 
{ 
    public Layer Parent { get; set; } 
    public Dictionary<Int32, Layer> Children{ get; set; } 
} 

public class FinalLayer: Layer 
{ 
    public Layer Parent { get; set; } 
    public String ResultTableName { get; set; } 
} 
+0

嗯,我應該重新編輯我發佈的內容,不同的圖層A,B,C和D具有其他與此表格不相關的不同屬性。這使得它們有所不同並且不能關聯,但是我確實可以使用父類創建一個字典,同時它可以鬆散圖層排序(例如,在樹視圖中,分配給0級的節點是Project和resp level1 LayerA,level2 LayerB,level3 LayerC,level4 Layer。 – Perret 2013-05-13 04:51:36

相關問題