C# 如何读取嵌套类的数据?
如果我的问题不清楚,我很抱歉 我有一个类包含一些属性,其中一个是“Parent”,它与这个类的类型相同 当我从数据库中读取数据时,我为每个属性设置了合适的值但当我从数据库中读取“ParentID”属性时,如何放置它呢 如果不清楚,我就举个例子 非常感谢您的光临 这是我的课: 当我从数据库中读取数据时,我将“ID”填充为int,“Name”填充为stringC# 如何读取嵌套类的数据?,c#,.net,sql,class,class-design,C#,.net,Sql,Class,Class Design,如果我的问题不清楚,我很抱歉 我有一个类包含一些属性,其中一个是“Parent”,它与这个类的类型相同 当我从数据库中读取数据时,我为每个属性设置了合适的值但当我从数据库中读取“ParentID”属性时,如何放置它呢 如果不清楚,我就举个例子 非常感谢您的光临 这是我的课: 当我从数据库中读取数据时,我将“ID”填充为int,“Name”填充为string 但是,当我从数据库中将“Parent”设置为“smsPart”时,如何将其设置为“ParentID”int.?如果要使用延迟求值,一种方法是
但是,当我从数据库中将“Parent”设置为“smsPart”时,如何将其设置为“ParentID”int.?如果要使用延迟求值,一种方法是为ParentID创建一个私有字段(创建时填充)、一个私有父字段和一个公共父属性:
public class YourClassHere
{
private YourClassHere _parent;
private int _parentId;
public YourClassHere Parent
{
get
{
if (_parent == null)
{
_parent = DBWrapper.GetMyClassById(_parentId)
}
return _parent
}
}
}
然后,从父数据的ID中读取父数据并创建一个对象(同一个类),然后将数据传递给它以初始化属性(与子数据完全相同) 以上只是一个例子。方法取决于您如何处理当前对象(子对象),并且您没有给我们任何代码来查看 从我所做的。它看起来像这样:
class Data {
public Data(int pDataID) {
// Load data of pDataID
// Assign the loaded data
this.parent = new Data(ParentID);
}
}
我希望这足以让您适应您的需要。您可能需要这样做
Parent = GetParentById(ParentID);
尽管这实际上取决于您如何实现数据访问层,但您必须递归地从数据库检索数据,以便正确地具体化对象,直到最后一条记录的ParentID为null。我想您是手动生成数据库类的 您可以使用字典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);
}
}
使用系统;
使用System.Collections.Generic;
班级计划{
类外部{
静态字典_id=新字典();
公共外部(内部id){
_id[id]=这个;
}
公共阶级内部{
公共外部父级{
得到;
设置
}
公共内部(int parentId){
父项=外部。_id[parentId];
}
}
}
静态void Main(字符串[]参数){
外部o=新的外部(1);
外部.内部i=新的外部.内部(1);
}
}
你也可以考虑使用.
谢谢你帮我做了这样的事情:
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;
集合列表=新集合();
Dictionary dic=新字典();
使用(康涅狄格州)
{
conn.Open();
SqlDataReader dr=command.ExecuteReader();
while(dr.Read())
{
smsPart xPart=新smsPart();
xPart.ID=int.Parse(dr[“ID”].ToString());
如果(!string.IsNullOrEmpty(dr[“Parent”].ToString())
xPart.ParentID=int.Parse(dr[“Parent”].ToString());
xPart.Name=dr[“Name”].ToString();
dic.Add(xPart.ID,xPart);
}
}
foreach(dic.值中的smsPart子零件)
{
如果(childPart.ParentID>0)
{
childPart.Parent=dic[childPart.ParentID];
}
列表。添加(childPart);
}
退货清单;
所以,在您看来,这是好的吗???。这将是非常好的,但我只想从数据库中获取信息一次,我可以用更有效的方法吗??。
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;