Как насчет этого? (Псевдо-код)
class HierarchicalObject
{
int ID;
List<HierarchicalObject> Children;
// Other fields
}
...
var roots = new List<HierarchicalObject>();
var index = new Dictionary<int, HierarchicalObject>();
while (reader.Read())
{
HierarchicalObject current = new HierarchicalObject();
// fill in data from record
int parentID = (int)reader["ParentID"];
if (parentID != 0)
{
index[parentID].Children.Add(current);
}
else
{
roots.Add(current);
}
index.Add(current.ID, current);
}
// roots now contains list of root objects; throw out index
Это предполагает, что все ваши объекты однородны, а не имеют отдельные родительские / дочерние классы, а также, что порядок таков, что вы не будете читать по дочернему элементу, прежде чем прочитаете по его родительскому ... для нескольких уровней, и вы можете адаптировать его по мере необходимости.
(Если второе предположение неверно, вы можете сначала прочитать все записи в индексе, а затем вернуться к индексу и исправить корни и потомки.)