2016-04-25 4 views
1

Imagine У меня есть хранимая процедура, которая должна вернуть три таблицы:заселить вложенные коллекции с 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); 
     } 
    } 
} 
  • В третьей вложенности, как я могу извлечь в AThingID?
  • Есть ли более умный способ заполнения вложенных коллекций? Я хотя и о словарях, но, возможно, есть более простой/более четкий образец.
  • Как насчет более высокого уровня гнездования?

ответ

1

Держа с существующим кодом, я думаю, что самый простой способ будет создать временный словарь, а затем добавить к нему после создания BThing:

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

После создания downloadedBThing:

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

Затем при создании CThing:

int AThingID = BIDtoAID[downloadedCThing.BID]; 

Если вы имеете дело со многими записями, я считаю, что сохранение временного словаря с этими идентификаторами было бы самым результативным.