【问题标题】:Populate nested collections with DataReader使用 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?
  • 有没有更聪明的方法来填充嵌套集合?起初我虽然是关于字典的,但也许有一个更简单/更清晰的模式。
  • 更多级别的嵌套呢?

【问题讨论】:

    标签: c# .net sql-server dto datareader


    【解决方案1】:

    保持现有代码,我认为最简单的方法是创建一个临时字典,然后在创建 BThing 后添加到它:

    Dictionary<int, int> BIDtoAID = new Dictionary<int, int>();
    

    创建下载的BThing后:

    BIDtoAID.Add(downloadedBThing.BID, downloadedBThing.AID);
    

    然后,在创建 CThing 时:

    int AThingID = BIDtoAID[downloadedCThing.BID];
    

    如果您要处理许多记录,我认为使用这些 ID 保存一个临时字典会是最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多