PDA

View Full Version : جوین جدول با خودش (self join) برای پیدا کردن رکوردهای والد و فرزند



bitcob589
جمعه 23 اسفند 1392, 12:12 عصر
با سلام
یک جدول در دیتابیس دارم که دارای فیلدهای زیر می باشد

id که کلید اصلی است
parentid
که از نوع int است
Name
اطلاعات جدول به صورت زیر می باشد





id


parentid


Name



1
0
خودرو


2
0
پوشاک


3
1
پراید


4
2
دامن


5
1
پیکان


6
0

بهداشتی















در نظر دارم با entity دستور سلکتی بنویسیم که اگر parentid که اگه با idبرابر بود در یک سطر گرید ویو نمایش دهد و در صورتی که parentid با id با هم برابر نبودند آن رکودی که id در فیلد parentid وجود نداشت به صورت عادی نمایش دهد در جدول بالا parentid رکود پراید 1 و id خودرو 1 است پس نام خودرو و پراید در یک سر گرید ویو نمایش دهد در جدول بالا رکود id 6در هیچ یک از parentid وجود ندارد پس به صورت عادی در یک سر گرید ویو نمایش داده شود و نتیجه دستور سلکت مثل جدول زیر باشد

خروجی گرید ویو چیزی شبیه جدول زیر :


خودرو
پراید


پوشاک
دامن


خودرو
پیکان


بهداشتی
------

Mahmoud.Afrad
جمعه 23 اسفند 1392, 13:13 عصر
کافیه این جدول رو با خودش join کنی با شرطی که گفتی:

var result = from t in db.tbl3
join t2 in db.tbl3
on t.id equals t2.parentId
select new
{
Type = t.name,
Production = t2.name
};

bitcob589
جمعه 23 اسفند 1392, 13:58 عصر
کد بالا به درستی جواب داد اما





id


parentid


Name



1
0
خودرو


2
0
پوشاک


3
1
پراید


4
2
دامن


5
1
پیکان


6
0

بهداشتی

















در جدول بالا رکود 6 که بهداشتی است در خروجی نمایش داده نمی شود به علت اینکه
parentid با هیچ یک از id تطبیق ندارد چگونه می توان در صورتی که
parentid باهیچ یک idمطابقت نداشت آن رکود در خروجی دستور نمایش دهیم مثل رکود 6 جدول بالا
parentid صفر است چگونه رکود 6 در خروجی نمایش دهیم چگونه خروجی کد شبیه
گرید ویو
جدول زیر شود



خودرو
پراید


پوشاک
دامن


خودرو
پیکان


بهداشتی
------

Mahmoud.Afrad
جمعه 23 اسفند 1392, 17:00 عصر
var result = from t in db.tbl3.AsEnumerable()
join t2 in db.tbl3.AsEnumerable()
on t.id equals t2.parentId into joinResult
from j in joinResult.DefaultIfEmpty(new tbl3 { id = t.id, name = "------------------------" })
where t.parentId == 0
select new
{
Type = t.name,
Production = j.name
};