如何读取嵌套类的数据?

时间:2009-09-29 11:28:38

标签: c# .net sql class class-design

如果我的问题不明确,我很抱歉。

我有一个类包含一些属性,其中一个属于“Parent”,它与此类的类型相同。

当我从数据库中读取数据时,我为每个属性设置了合适的值。 但是当我从数据库中读取“ParentID”时,我怎么能把“Parent”属性。

如果不清楚我会把示例。

非常感谢你。

这是我的班级:

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,将“Name”填充为字符串。

但当我从数据库中读取“ParentID”int时,我将如何将“Parent”设置为“smsPart”。??

6 个答案:

答案 0 :(得分:1)

如果您想使用延迟评估,一种方法是为ParentId创建一个私有字段,您可以在创建时填充私有字段,私有父字段和公共父属性:

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

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

答案 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

答案 2 :(得分:0)

然后从其ID中读取父数据并创建一个对象(同一个类),然后将数据传递给它以初始化属性(就像对子项一样)。

以上只是一个例子。这样做的方法取决于你如何处理当前对象(孩子),你没有给我们任何代码来看。

从我所做的。它看起来与此相似:

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

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

我希望这足以让你适应它以适应你的。

答案 3 :(得分:0)

你可能需要做这样的事情

Parent = GetParentById(ParentID);

虽然这实际上取决于您如何实施数据访问层

答案 4 :(得分:0)

您必须以递归方式从数据库中检索数据才能正确实现对象,直到最后一条记录的ParentID为空。

答案 5 :(得分: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;

你认为这样做很好吗?