- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
var r = from t in ds.ProductTags
where t.ProductTagID == tag
|| t.Parent.ProductTagID == tag
|| t.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.Parent.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.Parent.Parent.Parent.Parent.ProductTagID == tag
|| t.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.ProductTagID == tag
select t;
Это мой код. Надоело писать рекурсивные СTE чтобы выбрать всех детишек. Спросил у кастомера можно ли ограничить вложенность. Он согласился ;).. На свою голову ;).
http://www.rockstarapps.com/wordpress/?p=82
Там нормально описаны выборки без вы%бонов.
А вот псевдокод как легко создать дерево (если оно таки тебе понадобится).
class TreeNode
{
void AddChild(TreeNode* child)
void * data;
}
class SerializedNode
{
int thisId;
int parentId;
void * data;
}
TreeNode * BuildTree(SerializedNode* nodes[], int count)
{
hash_map<int, TreeNode *> insertedMap;
TreeNode * root = new TreeNode();
for (int i = 0; i != count; i++) {
insertedMap.insert(nodes[i]->thisId, nodes[i]);
if (0 == nodes[i]->parentId) {
root.AddChild(nodes[i]);
} else {
insertedMap.find(nodes[i]->parentId).AddChild(nodes[i]);
}
}
return root;
}
Во-вторых, выборка следует быть с помощью средств СУБД. Хоть статью почитал?
Интересно посмотреть на скрип которий линк сгенерит и пустит на сиквел.
на самом деле деревянные данные достаточно часто трабл - обычно пишу хранимую процедуру и это правильно с точки зрения как читаемости кода, так и производительности - можно написать ее 1 раз и копипастить с минимальными изменениями для всех деревьев ;)