2016-04-25 40 views
1
嵌套集合

想象我有一个存储过程应返回三个表:填充的DataReader

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); 
     } 
    } 
} 
  • 在第三排料,我怎么能retreive的AThingID?
  • 有更聪明的方式来填充嵌套集合吗?我虽然起初是关于字典,但也许有一个更简单/更清晰的模式。
  • 更多关卡嵌套怎么样?

回答

1

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

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

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

创建downloadedBThing后

然后,当创建CThing:

int AThingID = BIDtoAID[downloadedCThing.BID]; 

如果你正在处理很多记录,我认为用这些ID保留一个临时字典将是最高性能的。