使用 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 引用了BThingBThing 引用了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() 之间的区别

我应该如何测试从 DataReader 填充列表的方法?

使用 datareader 用数据库多列中的数据填充文本框

如何使用nodejs从我的数据模型中的嵌套对象填充mongodb中的数据集合?

MongoDB:如何使用查找查询填充嵌套对象?