سلام دوستان یک پروژه در Asp.net Core 2.2 داشتم که یک کویری مشابه دستور زیر رو توش نوشته بودم و بدون هیچ خطایی اجرا می شه
public List<ProductViewModel> ProductListForSearch(int drpcourse = -1)
{
var Query = (from p in _context.Product_Tbl
select new ProductViewModel()
{
ProductID = p.ProductID,
ProductImage = p.ProductImage,
pGroupID = _context.ProductGroups_Tbl.Where(pg => pg.ProductID == p.ProductID).Select(s => s.GroupID).ToArray()
});
if (drpcourse != -1)
{
Query = Query.Where(c => c.pGroupID.Contains(drpcourse));
}
return Query.ToList();
}
همون طور که مشخصه در انتهای کویری بر اساس پارامتر drpcourse یک فیلتر انجام میشه. کلاس ProductViewModel هم به صورت زیر هست.
public class ProductViewModel
{
public int ProductID { get; set; }
public string ProductImage { get; set; }
public int[] pGroupID { get; set; }
}
حالا دقیقا این کویری رو میخوام در یک پروژه با Asp.net Core 3.1 که از Entity Framework 3.1 هم استفاده می کنه اجرا کنم اما خطای زیر رو میده:
InvalidOperationException: The LINQ expression 'DbSet<Product>
.Where(p => DbSet<ProductGroups>
.Where(p0 => p0.ProductID == p.ProductID)
.Select(p0 => p0.GroupID)
.ToArray()
.Contains(__drpcourse_0))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
لطفا راهنمایی کنید چرا در نسخه Core 2.2 این کویری اجرا میشه اما در نسخه 3.1 خطا داره ؟
خطایی که شما دارید به این خاطر هست که در انتیتی فریم ورک نسخه 3.0 به بعد نسبت به انتیتی فریم ورک 2.2 تغییراتی وجود داشته. دستور زیر رو که شما در Core 2.2 استفاده می کردید و به درستی هم جواب میداده رو در نظر بگیرید :
Query = Query.Where(c => c.pGroupID.Contains(drpcourse));
خب در این دستور همه اطلاعات از دیتابیس واکشی شده و به روی سرور منتقل میشه و در سرور با توجه به دستور Contains اطلاعات فیلتر میشه و خروجی نمایش داده میشه. این چیزی هست که در Core 2.2 انجام میشه. اما یک اشکال داره و اونم این هست که باید همه اطلاعات به سرور بیاد و در سرور فیلتر بشه و خروجی مورد نظر نمایش داده بشه. خب این جا بار اضافی داره بر روی سرور تحمیل میشه. در انتیتی فریم ورک نسخه 3.0 به بعد برای این مشکل راه حل دادن و دلیل خطای شما هم همین هست.
در انتیتی فریم ورک نسخه 3.0 به بعد client evaluation پشتیبانی نمیشه. یعنی اطلاعات رو نمیشه فرستاد روی سرور و حافظه سرور و بعد جستجو کرد.
اما راه حلی که در انتیتی فریم ورم 3.0 به بعد برای استفاده از متد Contains وجود داره این هست که از متد AsEnumerable استفاده بشه. وقتی از این متد استفاده می کنید کوئری شما در سمت دیتابیس اجرا میشه و فقط نتیجه به سمت سرور برگردانده میشه. این روش بازدهی بسیار بهتری در داده های زیاد دارد.
در نتیجه کوئری شما به این شکل باید تغییر کنه
public List<ProductViewModel> ProductListForSearch(int drpcourse = -1)
{
var Query = (from p in _context.Product_Tbl
select new ProductViewModel()
{
ProductID = p.ProductID,
ProductImage = p.ProductImage,
pGroupID = _context.ProductGroups_Tbl.Where(pg => pg.ProductID == p.ProductID).Select(s => s.GroupID).ToArray()
}).AsEnumerable();
if (drpcourse != -1)
{
Query = Query.Where(c => c.pGroupID.Contains(drpcourse));
}
return Query.ToList();
}
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
54
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
92
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
116
- پاسخ :
0
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
54
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
92
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|