2009-09-29 70 views
0

如果我的問題不清楚,我很抱歉。如何讀取嵌套類的數據?

我有一個類包含一些屬性,其中一個是「Parent」,它與這個類的相同類型。

當我從數據庫中讀取數據時,我爲每個屬性設置了合適的值。 但我怎麼能把「父」屬性,當我從數據庫中讀取它作爲「ParentID」。

如果不清楚,我會把例子。

非常感謝您的高級。

這是我的課:

class smsPart 
    { 
     private int _id; 
     private smsPart _parent; 
     private string _name; 


     public int ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     public smsPart Parent 
     { 
      get { return _parent; } 
      set { _parent = value; } 
     } 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 



     public smsPart() 
     { 
      this._id = 0; 
      this._parent = null; 
      this._name = null; 
     } 

     public smsPart(int pID, smsPart pParent, string pName, smsType pType) 
     { 
      this._id = pID; 
      this._parent = pParent; 
      this._name = pName; 
     } 
    } 

,當我讀數據庫中的數據我填寫「ID」 int和「名稱」作爲字符串。

但我怎麼會設置「父」作爲「smsPart」,當我從數據庫中讀取它作爲「ParentID」int。??

+1

一個代碼示例會幫助... –

回答

1

我想你手動生成的數據庫類...

你可以使用字典ID - >對象如下:

using System; 
using System.Collections.Generic; 

class Program { 

    class Outer { 

     static Dictionary<int, Outer> _ids = new Dictionary<int, Outer>(); 

     public Outer(int id) { 
      _ids[id] = this; 
     } 

     public class Inner { 
      public Outer Parent { 
       get; 
       set; 
      } 

      public Inner(int parentId) { 
       Parent = Outer._ids[parentId]; 
      } 

     } 
    } 

    static void Main(string[] args) { 
     Outer o = new Outer(1); 
     Outer.Inner i = new Outer.Inner(1); 
    } 
} 

您也可以考慮使用linq to sql

1

如果您想使用延遲計算,一個方法是創建一個私有字段中的ParentId,您在創建填充,私人父字段和公共Parent屬性:

public class YourClassHere 
{ 
    private YourClassHere _parent; 
    private int _parentId; 

    public YourClassHere Parent 
    { 
     get 
     { 
      if (_parent == null) 
      { 
       _parent = DBWrapper.GetMyClassById(_parentId) 
      } 
      return _parent 
     } 
    } 
} 
+0

這將是非常好的,但我想從數據庫中獲取信息只需一次,我可以用更有效的方式來做到這一點嗎? –

0

然後你讀來自其ID的父數據並創建一個對象(同一個類),然後將數據傳遞給它以初始化屬性(與您對子對象完全相同)。

以上只是一個例子。實現它的方式取決於你如何處理當前對象(孩子),並且你沒有給我們任何代碼來看。

從我所做的。它看起來類似於這樣的:

class Data { 
    public Data(int pDataID) { 
     // Load data of pDataID 
     // Assign the loaded data 

     this.parent = new Data(ParentID); 
    } 
} 

我希望這足以讓您適應它以適應您的需求。

0

你可能需要做這樣的事情

Parent = GetParentById(ParentID); 

雖然這真的取決於你如何實現數據訪問層

0

你必須爲了遞歸地從數據庫中檢索數據正確實現您的對象,直到最後一條記錄的ParentID爲空。

0

謝謝你幫我,我做了這樣的事情:

Collection<smsPart> list = new Collection<smsPart>(); 
    Dictionary<int, smsPart> dic = new Dictionary<int, smsPart>(); 

    using (conn) 
    { 
     conn.Open(); 
     SqlDataReader dr = command.ExecuteReader(); 
     while (dr.Read()) 
     { 
      smsPart xPart = new smsPart(); 

      xPart.ID = int.Parse(dr["ID"].ToString()); 
      if (!string.IsNullOrEmpty(dr["Parent"].ToString())) 
       xPart.ParentID = int.Parse(dr["Parent"].ToString()); 
      xPart.Name = dr["Name"].ToString(); 

      dic.Add(xPart.ID, xPart); 
     } 
    } 
    foreach (smsPart childPart in dic.Values) 
    { 
     if (childPart.ParentID > 0) 
     { 
      childPart.Parent = dic[childPart.ParentID]; 
     } 
     list.Add(childPart); 
    } 
    return list; 

因此,這是很好的在你看來??。