PDA

View Full Version : سوال: نحوه استفاده از subquery در Linq



hahaie
سه شنبه 17 آذر 1394, 15:43 عصر
سلام
مدیران عزیز سوال اینجانب از Linq (مربوط به C#) می باشد.بنابراین خواهشا حذف نکنید !!
کد زیر رو چطوری میشه با Linq نوشت:


select p.name person_name,
(select pp.name from person pp where pp.id=p.manager_id)manager_name

from person p

Mahmoud.Afrad
چهارشنبه 18 آذر 1394, 08:54 صبح
تا اونجایی که متوجه شدم یک جدول خودارجاع داری و میخوای اسم رو به جای کلیدخارجی(ارجاع) بزاری. خب سوالی که مطرحه اینه که آیا رابطه خودارجاع ایجاد کردی(رابطه از person به person) یا نه؟ اگر رابطه ایجاد کردی به راحتی میتونی(کد خواناتر میشه) البته بدون رابطه هم میشه(منطقیش اینه که رابطه ایجاد کنی).

hahaie
چهارشنبه 18 آذر 1394, 14:54 عصر
بله رابطه خود ارجاع هستش.
قبلا توی oracle که با داده های خیلی زیاد کار میکردم اینکه از subquery استفاده کنم به جای ایجاد رابطه (جوین کردن جدول با خودش)خیلی بهتر و سریعتر بود.
حالا نمیدونید چطوری میشه بدون ایجاد رابطه کوئری فوق رو با linq نوشت؟

Mahmoud.Afrad
پنج شنبه 19 آذر 1394, 00:42 صبح
یک مدل و پراپرتی های لازم رو ایجاد کنید:

class PersonViewModel
{
public int PersonId { get; set; }
public string PersonName { get; set; }
public string ManagerName { get; set; }
}


اگر رابطه ایجاد کرده باشید ، هر شئ Person دارای یک پراپرتی به اسم Persons خواهد بود که فرزندانش هست و یک پراپرتی Pserson1 خواهد داشت که والدش هست. به صورت زیر میتونی کوئری بزنی(نام پراپرتی ها رو میتونی عوض کنی)

var query =
from p in db.Persons
select new PersonViewModel()
{
PersonId = p.Id,
PersonName = p.name,
ManagerName = p.Person1 != null ? p.Person1.name : null
};


اگر رابطه ایجاد نکردی به این صورت
از طریق join

var query =
from p in db.Persons
join pa in db.Persons on p.manager_id equals pa.Id into joinResult
from j in joinResult.DefaultIfEmpty()
select new PersonViewModel()
{
PersonId = p.Id,
PersonName = p.name,
ManagerName = j.name
};

یا از طریق subquery

var query =
from p in db.Persons
let m = (from pa in db.Persons where pa.Id == p.manager_id select pa).FirstOrDefault()
select new PersonViewModel()
{
PersonId = p.Id,
PersonName = p.name,
ManagerName = m.name
};