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); } } }
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.