PDA

View Full Version : حذف نود انتخاب شده به همراه همه بچه های آن



farzane_t
سه شنبه 21 خرداد 1392, 14:31 عصر
سلام
من از یه جدول برای نگهداری منوی سایت استفاده کردم که به این صورته :



MenuID-------MenuName------ParentID

1----------------name1------------0

2----------------name2------------0

3----------------name1-2----------2

4----------------name2-2----------3

5----------------name3------------2


حالا واسه بخش مدیریت منو، میخوام این امکان باشه که وقتی نودی انتخاب شد، اون نود و همه بجه هاش حذف بشه. یعنی وقتی نودی انتخاب میشه باید یررسی بشه که بچه داره یا نه اگه داره بچه های اون هم بررسی بشن.
فکر میکنم باید با استفاده از یه تابع بازگشتی این بررسی رو انجام بدم و هربار هم MenuID رو جایی مثلا درون آرایه ذخیره کنم و بعد عمل حذف انجام بشه. اما هرکار کردم به نتیجه ای نرسیدم، هرچقدرهم سرچ زدم به نتیجه نرسیدم. منو n سطحیه.

ممنون میشم راهنماییم کنید.

mehrzad_ali
سه شنبه 21 خرداد 1392, 19:26 عصر
شما فقط DeleteByPageID رو صدا بزن




public void DeleteByPageID( string pageID)
{
var q = from c in mycms.Pages
where c.pageID == Convert.ToInt32(pageID)
select c;

foreach (var item in q)
{
mycms.Pages.DeleteOnSubmit(item);
}

mycms.SubmitChanges();

DeleteByParentID(pageID);
}

private void DeleteByParentID(string parentID)
{
var q = selectParentID(parentID);
foreach (var item in q)
{
mycms.Pages.DeleteOnSubmit(item);
mycms.SubmitChanges();

DeleteByParentID(item.parentID.ToString());
}
}

farzane_t
سه شنبه 21 خرداد 1392, 19:46 عصر
ممنون بابت جواب. میشه خواهش کنم راجع به کد برام توضیح بدین؟ متوجه نشدم. اون mycms.Pages چیه؟

mehrzad_ali
سه شنبه 21 خرداد 1392, 19:53 عصر
خواهش میکنم
این کد با LinqToSql هست
تبدیلش به ado.net کاری نداره ازش ایده بگیر

bftarane
جمعه 24 خرداد 1392, 15:21 عصر
سلام.
ولی من فکر میکنم ابتدا باید یه پیمایش انجام بشه تا به آخرین فرزند برسیم بعد به ترتیب فرزند، والد این فرزند و والد این والد و همین طور رو به بالا عمل حذف انجام بشه.
یعنی تا جایی که من می دونم تا فرزند حذف نشه اجازه حذف پدرش داده نمیشه در صورتی که در کدهای بالا ابتدا والد حذف شده. یعنی در linq این امکان گذاشته شده؟

zerocool151
جمعه 24 خرداد 1392, 17:15 عصر
با این کد ID تمام Child هها رو بدست بیار
بعد با یک for همشو پاک کن

Begin
;with cte as
(
select id, rnk=0 from Groups
where parent = @ID

union all

select t.id, rnk+1
from cte join Groups t
on cte.id = t.parent
)
select *
from
(
select *, dense_rank() over(order by rnk desc) rk
from cte
)t
where rk = 1