Remplir des collections nestedes avec DataReader

Imaginez que j'ai une procédure stockée qui devrait returnner trois tables:

SELECT AID, AName FROM AThings SELECT BID, BName, AID FROM BThings SELECT CID, CName, BID FROM CThings 

Dans une représentation de class:

 public class AThing { int AID { get; set; } ssortingng AName { get; set;} Dictionary<int, BThing> BThingsColl { get; set;} } public class BThing { int BID { get; set; } ssortingng BName { get; set;} int AID { get; set; } List<CThing> CThingsColl { get; set;} } public class CThing { int CID { get; set; } ssortingng CName { get; set;} int BID { get; set; } } 

CThing a une reference à BThing , BThing fait reference à AThing .

Pour exécuter la procédure stockée et pour remplir mon object, j'utilise un 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.GetSsortingng(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.GetSsortingng(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.GetSsortingng(1); downloadedCThing.BID = dr.GetInt32(2); int AThingID = // How to retreive me? results[AThingID].BThingsColl[downloadedCThing.BID].Add(downloadedCThing); } } } 
  • Dans la troisième imbrication, comment puis-je récupérer l'AThingID?
  • Existe-t-il un moyen plus astucieux de peupler les collections nestedes? Je pense à propos des dictionarys comme au début, mais peut-être qu'il y a un schéma plus simple / plus clair.
  • Qu'en est-il de plus de nidification de niveau?

En gardant votre code existant, je pense que la façon la plus simple serait de créer un dictionary temporaire, puis de l'append après avoir créé le BThing:

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

Après la création de DownloadBThing:

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

Ensuite, en créant votre CThing:

 int AThingID = BIDtoAID[downloadedCThing.BID]; 

Si vous traitez de nombreux loggings, je pense que garder un dictionary temporaire avec ces identifiants serait le plus performant.