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