使用 DataReader 填充嵌套集合
Posted
技术标签:
【中文标题】使用 DataReader 填充嵌套集合【英文标题】:Populate nested collections with DataReader 【发布时间】:2016-04-25 15:56:44 【问题描述】:假设我有一个应该返回三个表的存储过程:
SELECT AID, AName
FROM AThings
SELECT BID, BName, AID
FROM BThings
SELECT CID, CName, BID
FROM CThings
在类表示中:
public class AThing
int AID get; set;
string AName get; set;
Dictionary<int, BThing> BThingsColl get; set;
public class BThing
int BID get; set;
string BName get; set;
int AID get; set;
List<CThing> CThingsColl get; set;
public class CThing
int CID get; set;
string CName get; set;
int BID get; set;
CThing
引用了BThing
,BThing
引用了AThing
。
要执行存储过程并填充我的对象,我使用的是DataReader
:
using (SqlDataReader dr = cmd.ExecuteReader())
var results = new Dictionary<int, AThing>();
while(dr.Read())
var downloadedAThing = new AThing();
downloadedAThing.BThingsColl = new Dictionary<int, BThing>();
downloadedAThing.AID = dr.GetInt32(0);
downloadedAThing.AName = dr.GetString(1);
results.Add(downloadedAThing.AID, downloadedAThing);
if (dr.NextResult)
while(dr.Read())
var downloadedBThing = new BThing();
downloadedBThing.CThingsColl = new List<CThing>();
downloadedBThing.BID = dr.GetInt32(0);
downloadedBThing.BName = dr.GetString(1);
downloadedBThing.AID = dr.GetInt32(2);
results[downloadedBThing.AID].BThingsColl.Add(downloadedBThing.BID, downloadedBThing);
if (dr.NextResult)
while(dr.Read())
var downloadedCThing = new CThing();
downloadedCThing.CID = dr.GetInt32(0);
downloadedCThing.CName = dr.GetString(1);
downloadedCThing.BID = dr.GetInt32(2);
int AThingID = // How to retreive me?
results[AThingID].BThingsColl[downloadedCThing.BID].Add(downloadedCThing);
在第三个嵌套中,如何检索 AThingID?
有没有更聪明的方法来填充嵌套集合?起初我虽然是关于字典的,但也许有一个更简单/更清晰的模式。
更多级别的嵌套呢?
【问题讨论】:
【参考方案1】:保持现有代码,我认为最简单的方法是创建一个临时字典,然后在创建 BThing 后添加到它:
Dictionary<int, int> BIDtoAID = new Dictionary<int, int>();
创建下载的BThing后:
BIDtoAID.Add(downloadedBThing.BID, downloadedBThing.AID);
然后,在创建 CThing 时:
int AThingID = BIDtoAID[downloadedCThing.BID];
如果您要处理许多记录,我认为使用这些 ID 保存一个临时字典会是最好的。
【讨论】:
以上是关于使用 DataReader 填充嵌套集合的主要内容,如果未能解决你的问题,请参考以下文章
使用 datareader 填充 mvc 模型时解决对象引用错误?
(string)reader[0] 和 reader[0].ToString() 之间的区别