2016-04-25 13 views
1

Stellen Ich habe eine gespeicherte Prozedur, die drei Tabellen zurückgeben sollte:Populate verschachtelte Sammlungen mit Datareader

SELECT AID, AName 
FROM AThings 

SELECT BID, BName, AID 
FROM BThings 

SELECT CID, CName, BID 
FROM CThings 

In einer Klassendarstellung:

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 hat einen Verweis auf BThing, hat BThing einen Verweis zu AThing.

Um die gespeicherte Prozedur ausgeführt, und mein Objekt zu füllen, ich bin mit einem 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); 
     } 
    } 
} 
  • In der dritten nisten, wie kann ich die AThingID retreive?
  • Gibt es eine cleverere Möglichkeit, verschachtelte Sammlungen zu bevölkern? Ich habe zunächst über Wörterbücher nachgedacht, aber vielleicht gibt es ein einfacheres/klareres Muster.
  • Wie wäre es mit einer mehrstufigen Verschachtelung?

Antwort

1

mit Ihrem vorhandenen Code zu halten, ich denke, der einfachste Weg, eine temporäre Wörterbuch zu erstellen wäre, und dann, um es hinzuzufügen, nachdem der BThing erstellen:

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

Nach downloadedBThing erstellen:

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

Dann, während der Erstellung Ihres CThing:

int AThingID = BIDtoAID[downloadedCThing.BID]; 

Wenn Sie mit vielen Datensätzen zu tun haben, halte ich ein temporäres Wörterbuch mit diesen IDs für am leistungsstärksten.

Verwandte Themen