我正在處理測試的軟件,使用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用於過濾和創建包含具有當前信息表模式的子層的字典。
謝謝。
'LayerB'有一個'詞典<的Int32,LayerB>'財產?這可能嗎? – jarvanJiang 2013-05-13 07:42:42
Typo ... fixed; 0 – Perret 2013-05-13 16:09:18