PDA

View Full Version : بروز خطا در استفاده از متدهای تجمیعی با استفاده از LINQ



mmbguide
چهارشنبه 18 فروردین 1400, 23:34 عصر
سلام

یک ViewModel دارم که باید بصورت زیر پیاده سازی بشه:


Public class ShowGroupViewModel
{
public int GroupID { get; set; }
public string GroupTitle { get; set; }
public int PageCount { get; set; }
}


متدی که باید فیلدها ViewModel را مقدار دهی بکنه بصورت زیر پیاده سازی شده:


public IEnumerable<ShowGroupViewModel> GetGroupsForView()
{
return db.PageGroups.Select(p => new ShowGroupViewModel()
{
GroupID = p.GroupID,
GroupTitle = p.GroupTitle,
PageCount = p.Pages.Count()
});
}


اما برنامه در خطی که p.Pages.Count() نوشته شده خطای زیر ار نمایش می دهد:

The specified type member is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported


مشکل در استفاده از متد Count هستش چون متد بالا اگر بصورت زیر پیاده سازی بشه درست کار میکنه و خطایی نمیده:

public IEnumerable<ShowGroupViewModel> GetGroupsForView()
{
return db.PageGroups.Select(p => new ShowGroupViewModel()
{
GroupID = p.GroupID,
GroupTitle = p.GroupTitle,
PageCount = db.Pages.Count(n => n.GroupID == p.GroupID)
});
}


لطفا راهنمایی کنید که چرا امکان استفاده از Count در حالت اول وجود نداره ولی با ارجاع به Context و دسترسی به جدول مورد نظر میشه خروجی را مطابق پیاده سازی دوم بدست آورد. آیا روش دوم در Performance برنامه اثر منفی میذاره؟

ممنون اگر توضیح بدهید

Mahmoud.Afrad
یک شنبه 29 فروردین 1400, 22:11 عصر
کدفرست کار میکنید؟
ساختار جداول به چه صورته؟

mmbguide
جمعه 03 اردیبهشت 1400, 15:02 عصر
سلام

من نام ستون ها را ساده کردم:


public class Customer
{
[Key]
public int Id { get; set; }
public string FullName { get; set; }


public virtual System.Data.Entity.DbSet<Order> Orders { get; set; }
}


public class Order
{
[Key]
public int Id { get; set; }
public int CustomerId { get; set; }
public string Title { get; set; }


[ForeignKey("CustomerId")]
public virtual Customer Customer { get; set; }
}


یک جدول مشتری و یک جدول سفارش که ساختار جداول در بانک اطلاعاتی هستند. و در زیر ViewModel هستش که در اجرای دستورات تجمیعی که در پست #1 عنوان شده به مشکل بر میخورم:


public class ReportViewModel
{
public int CustomerId { get; set; }
public int OrderCount { get; set; }
}


در مدل بالا هر زمان که میخوام مقدار OrderCount را با استفاده از Count مقدار دهی کنم (مطابق پست #1) با خطا روبروی میشم مگر آنکه به روشی که گفتم اقدام کنم.

Mahmoud.Afrad
جمعه 03 اردیبهشت 1400, 16:09 عصر
جایی که رابطه را ایجاد کردید(کلاس customer خط۸) به جای DbSet از ICollection یا IList استفاده کنید.