Ciao,
quando ho dovuto fare una cosa del genere, quando non è stato possibile
creare una stored procedure (e su Access non mi pare sia possibile), di
solito ho caricato in memoria tutti i record invece di fare query ricorsive.
Normalmente questo metodo è molto più veloce, soprattutto quando hai a
che fare con database che hanno prestazioni scarse (es. AS400).
Esempio:
// classe item
private class Item
{
public readonly string name = null;
public readonly System.Collections.Generic.List<ItemAssoc> children
= new System.Collections.Generic.List<ItemAssoc>();
public Item(string name)
{
this.name = name;
}
}
// classe che rappresenta i dati di associazione padre/figlio
private class ItemAssoc
{
public readonly Item item = null;
public decimal quantity = 0;
public ItemAssoc(Item item)
{
this.item = item;
}
}
// elenco items
var items = new System.Collections.Generic.Dictionary<string, Item>();
// carica i dati dal database
foreach (var record in records)
{
string parent_name = "padre";
string child_name = "figlio";
decimal quantity = 0;
Item parent = null;
items.TryGetValue(parent_name, out parent);
if (parent == null)
{
// nuovo item
parent = new Item(parent_name);
items.Add(parent_name, parent);
}
Item child = null;
items.TryGetValue(child_name, out child);
if (child == null)
{
// nuovo item
child = new Item(child_name);
items.Add(child_name, child);
}
// nuova associazione padre/figlio con quantità associata
var assoc = new ItemAssoc(child);
assoc.quantity = quantity;
parent.children.Add(assoc);
}
Alla fine hai l'elenco di tutti gli item e per ogni item hai anche tutti
i figli con i relativi dati di associazione.
La proprità "children" la puoi trasformare eventualmente in Dictionary
se ti serve cercare velocemente un'associazione padre/figlio, così come
puoi aggiungere anche una proprietà "parents" per memorizzare anche
quali sono tutti i padri di un item.