Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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 чтобы выбрать всех детишек. Спросил у кастомера можно ли ограничить вложенность. Он согласился ;).. На свою голову ;).
База данных, видимо, по-умному организована, через правый и левый индексы обхода дерева. Или СУБД поддерживает рекурсивную выборку. Или можно создать хранимую процедуру =]
Аха, суперсокое решение. Для того чтобы получить детишек, загружаем в память все данные(наприммер 10000 нод), строем дерево, а потом получаем 5 детишек. Мега.
это пиздец)
на самом деле деревянные данные достаточно часто трабл - обычно пишу хранимую процедуру и это правильно с точки зрения как читаемости кода, так и производительности - можно написать ее 1 раз и копипастить с минимальными изменениями для всех деревьев 😉
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 раз и копипастить с минимальными изменениями для всех деревьев 😉