PDA

View Full Version : نوع خروجی متدی حاوی join با استفاده از linq



alibabaei2
یک شنبه 07 خرداد 1391, 17:22 عصر
با سلام
یک join با linq به شکل زیر نوشتم و درون یک متد هستش
می خواستم ببینم خروجی متد چی میشه؟


var d = from p in DataContext.Context.Posts
join u in DataContext.Context.Users
on p.UserId equals u.UserID
select new
{
name = u.FirstName,

text = p.PostText
};

فرید نجفلو
یک شنبه 07 خرداد 1391, 18:38 عصر
سلام
چون شما خروجی ها رو از خود موجودیت ها انتخاب نکردید نوع خود خروجی ناشناخته هست ولی اینترفیس Iqueryable رو پیدا سازی کرده
پس میشه گفت خروجی یک Queryable هست
در نتیجه از خود خروجی شما می تونید با لینک (LINQ) دوبره اقدام به کوری گیری کنید

IFA_USER
یک شنبه 07 خرداد 1391, 20:31 عصر
خروجی متد Var نمی تونه باشه یه Structure تعریف کن.

فرید نجفلو
یک شنبه 07 خرداد 1391, 23:33 عصر
خروجی متد Var نمی تونه باشه یه Structure تعریف کن.
سلام
مطمئنید؟!!
ولی این کد الان باید درست کار کنه
با var متغیر همون نوعی رو می گیره که نتیجه کوری هست یعنی اگه نوع کوری عوض بشه نوع متغیر هم عوض میشه

alibabaei2
یک شنبه 07 خرداد 1391, 23:33 عصر
سلام
چون شما خروجی ها رو از خود موجودیت ها انتخاب نکردید نوع خود خروجی ناشناخته هست ولی اینترفیس Iqueryable رو پیدا سازی کرده
پس میشه گفت خروجی یک Queryable هست
در نتیجه از خود خروجی شما می تونید با لینک (LINQ) دوبره اقدام به کوری گیری کنید

متوجه نشدم
میشه یکم بیشتر توضیح بدید

Sajjad.Aghapour
دوشنبه 08 خرداد 1391, 13:06 عصر
خروجی متد Var نمی تونه باشه یه Structure تعریف کن.

خروجی تابع درسته که نمیتونه var باشه ولی اینجا خروجی من نمیبینم تعریف شده باشه. اینجا var به صورت Anonymous Type در نظر گرفته شده و شما می تونی به عنوان Result اون رو برگردونی

اما برای جواب به این سوال:
دوتا راه حل به ذهن من میرسه: 1. استفاده از یک کلاس برای Wrap کردن داده های بازگشتی 2. استفاده از روش خودتون با مشخص کردن خروجی تابع از نوع IQueryable و استفاده از Reflector برای دسترسی به داده ها
راه اول:

public class Test
{
public string Name { get; set; }
public string Text { get; set; }
}

//
private IEnumerable<Test> GetData()
{
var d = from p in DataContext.Context.Posts
join u in DataContext.Context.Users
on p.UserId equals u.UserID
select new Test
{
Name = u.FirstName,
Text = p.PostText
};
return d;
}


راه دوم:

private IQueryable GetData()
{
var d = from p in DataContext.Context.Posts
join u in DataContext.Context.Users
on p.UserId equals u.UserID
select new
{
Name = u.FirstName,
Text = p.PostText
};

return d;
}

// Calling method
private void button1_Click(object sender, EventArgs e)
{
var data = GetData();
foreach (var item in data)
{
MessageBox.Show(item.GetType().GetProperty("Name").GetValue(item, null).ToString());
}

}